更新: 今天我找出问题所在:现在看一下小版本
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,当然这样我们看到第二行有效, 我已经在Alias" redirect"中看到了这种行为。同样,如果您的网址中存在某些文件夹跟踪,则会将剩余部分添加到最终重定向的网址以及查询字符串中。
所以当localhost / h / firstsecond工作正常但localhost / h / first / second没有,我知道可能接近知道发生了什么。
ARCHIEVE:
我试图在没有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 然后我认为发生的是
第一行RewriteRule锚/(。+)/你好[R,ENV = lang:hi]' s模式" anchor /(.+)"匹配,所以它重定向到localhost / hello,但由于没有L标志,重定向到localhost / hello处于保持状态,因此它位于
第二行"锚"与新的http:// localhost / hello不匹配,因此跳过
事情看起来像我一样,直到我看到下面的例子 例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,它处于保持状态,它会低于
第二行的模式" foo / bar"与http:// localhost / tmp1 /不匹配,所以跳过它,(如果我删除除前两行之外的所有行,我看到最终重定向到http:// localhost / tmp1 /)
第三行模式与http:// localhost / tmp1 /匹配,并转为http:// localhost / tmp3 /
第四行的模式匹配,重定向到http:// localhost / tmp4 /
第五行"你好"不匹配的重定向仍然是http:// localhost / tmp4 /
现在最后3小时的事情让我心动不已的是第六行" bar"匹配..并重定向到http:// localhost / tmp7 /(删除最后2行确认)如何?
第七个与预期不匹配
第八行tmp7 /与http:// localhost / tmp7 /匹配,然后最终重定向到http:// localhost / tmp5 /
现在的问题是为什么6' s" bar"匹配,如果它可以与输入的最旧网址(http:// localhost / foo / bar)匹配,那么为什么它在相同示例的第二行上不匹配,为什么它在示例1的第二行中不匹配?
记住所有目标模式指向文件夹外部(在父级,www中,以便它们无法再次回击到htaccess文件)
答案 0 :(得分:2)
首先是一个非常好的问题,有很多细节。
如果您启用RewriteLog
,您会发现这实际上是由此行引起的(当您请求http://localhost/h/first/second
网址时):
add path info postfix: /landingpage1.php/second
There a bug raised specifically for this issue on Apache.org.
当您从L
中省略RewriteRule
或DPI
(i.e. Discard Path Info
)个标记时会发生这种情况。
如果使用:
,它会表现良好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]
答案 1 :(得分:0)
- 第一行的模式" foo / bar"匹配url,所以它重定向到http:// localhost / tmp1 /,但由于没有L,它处于保持状态,它 在下面
醇>
不,由于发出重定向的[R]
标志,它的工作原理并非如此。重定向开始一个新的请求/响应周期,任何RewriteRules将从头开始。无论有没有[L]
标志,都会发生同样的事情。