gpt4 book ai didi

regex - 一系列没有 Last [L] Flag 的重写规则

转载 作者:行者123 更新时间:2023-12-02 01:36:51 27 4
gpt4 key购买 nike

更新:今天我有点找出问题所在:现在看看较小的版本

RewriteCond %{REQUEST_FILENAME} (.+)
RewriteRule first /landingpage1.php [R,ENV=lang:hi]

RewriteCond %{REQUEST_FILENAME} (.+)
RewriteRule second /landingpage2.php?id=%1&%{ENV:lang} [R,L]

我的 htaccess 文件位置是/www/h/文件夹如果我键入 localhost/h/firstsecond,它会返回 localhost/landingpage1.php,第 4 行不满足模式但是 如果我输入 localhost/h/first/second,问题就开始了,它 = 登陆 localhost/landingpage2.php?id=localhost/landingpage1.php&hi,实际上有一次,只有一次我没有知道怎么做,我在实验中发现使用 localhost/h/first/second url 时,它使用第一个 rewriterule 行重定向,例如 localhost/landingpage1.php//second ,当然这样我们可以看到第二行有效,我也曾在别名“重定向”中看到过这种行为,如果您的 url 中有某些文件夹尾随,它会将剩余部分与查询字符串一起添加到最终重定向的 url 中。

所以当 localhost/h/firstsecond 工作正常但 localhost/h/first/second 不工作时,我知道可能接近知道发生了什么。

归档:

我试图理解没有 Last 标志的一堆重写规则的行为考虑我的 htaccess 文件位置是 localhost/h/( Applications/AMPPS/www/h )

示例 1:

RewriteRule anchor/(.+) /hello [R,ENV=lang:hi]
RewriteRule anchor /anchor/guess [R]
RewriteRule /hello /yes [R]

如果我输入 localhost/h/anchor/text那么我认为发生的是

  1. 第一行 RewriteRule anchor/(.+)/hello [R,ENV=lang:hi] 的模式“anchor/(.+)”匹配,因此它重定向到 localhost/hello ,但是因为那里没有 L 标志,重定向到 localhost/hello 被暂停,因此它低于

  2. 第二行的模式“anchor”与新的 http://localhost/hello 不匹配,因此跳过

  3. 第三行的模式/hello 与 localhost/hello 匹配,最终重定向到 localhost/yes

事情似乎和我一样,直到我看到下面的例子示例 2:

RewriteRule foo/bar /tmp1/ [R]
RewriteRule foo/bar /tmp2/ [R]
RewriteRule (.+) /tmp3/ [R]
RewriteRule (.+) /tmp4/ [R]
RewriteRule hello /tmp6/ [R]
RewriteRule bar /tmp7/ [R]
RewriteRule hello /tmp8/ [R]
RewriteRule tmp7/ /tmp5/ [R]

相同的 htaccess 文件位置,我点击 url localhost/h/foo/bar ,我以为这会发生
1. 第一行的模式“foo/bar”与 url 匹配,所以它重定向到 http://localhost/tmp1/,但是因为没有 L ,它被搁置了,它在下面

  1. 第二行的模式“foo/bar”与 http://localhost/tmp1/不匹配,因此它被跳过,(如果我删除除前两行之外的所有行,我会看到最终重定向到 http://本地主机/tmp1/)

  2. 第三行的模式匹配http://localhost/tmp1/并转向http://localhost/tmp3/

  3. 第四行模式匹配,重定向到http://localhost/tmp4/

  4. 第五行的“hello”不匹配重定向仍然是http://localhost/tmp4/

  5. 最近 3 小时让我印象深刻的是第六行“bar”匹配..并重定向到 http://localhost/tmp7/(删除最后 2 行以确认)如何?

  6. 小七与预期不符

  7. 第八行 tmp7/与 http://localhost/tmp7/匹配,最后重定向到 http://localhost/tmp5/

现在的问题是为什么第 6 行的“bar”匹配,如果它可以匹配输入的最旧的 url (http://localhost/foo/bar ) 那么为什么它在同一示例的第二行不匹配以及为什么在示例 1 的第二行中没有匹配?

记住所有目标模式都指向文件夹外部(在父文件夹中,www,这样他们就不能再次回到 htaccess 文件)

最佳答案

首先是一个非常好的问题,包含很多细节。

如果启用 RewriteLog,您会注意到这实际上是由这一行引起的(当您请求 http://localhost/h/first/second URL 时):

add path info postfix: /landingpage1.php/second

There a bug raised specifically for this issue on Apache.org.

当您省略 LDPI (i.e. Discard Path Info) 时会发生这种情况来自 RewriteRule 的标志。

如果你使用它会表现良好:

RewriteCond %{REQUEST_FILENAME} (.+)
RewriteRule first /landingpage1.php [R,DPI,ENV=lang:hi]

RewriteCond %{REQUEST_FILENAME} (.+)
RewriteRule second /landingpage2.php?id=%1&%{ENV:lang} [R,L]

关于regex - 一系列没有 Last [L] Flag 的重写规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30717297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com