一系列没有Last [L] Flag

时间:2015-06-08 19:16:39

标签: regex apache .htaccess mod-rewrite

更新: 今天我找出问题所在:现在看一下小版本

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 然后我认为发生的是

  1. 第一行RewriteRule锚/(。+)/你好[R,ENV = lang:hi]' s模式" anchor /(.+)"匹配,所以它重定向到localhost / hello,但由于没有L标志,重定向到localhost / hello处于保持状态,因此它位于

  2. 之下
  3. 第二行"锚"与新的http:// localhost / hello不匹配,因此跳过

  4. 第三行的模式/ hello与localhost / hello匹配,最后重定向到localhost / yes
  5. 事情看起来像我一样,直到我看到下面的例子 例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:// localhost / tmp1 /)

    2. 第三行模式与http:// localhost / tmp1 /匹配,并转为http:// localhost / tmp3 /

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

    4. 第五行"你好"不匹配的重定向仍然是http:// localhost / tmp4 /

    5. 现在最后3小时的事情让我心动不已的是第六行" bar"匹配..并重定向到http:// localhost / tmp7 /(删除最后2行确认)如何?

    6. 第七个与预期不匹配

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

    8. 现在的问题是为什么6' s" bar"匹配,如果它可以与输入的最旧网址(http:// localhost / foo / bar)匹配,那么为什么它在相同示例的第二行上不匹配,为什么它在示例1的第二行中不匹配?

      记住所有目标模式指向文件夹外部(在父级,www中,以便它们无法再次回击到htaccess文件)

2 个答案:

答案 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中省略RewriteRuleDPI (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)

  
      
  1. 第一行的模式" foo / bar"匹配url,所以它重定向到http:// localhost / tmp1 /,但由于没有L,它处于保持状态,它   在下面
  2.   

不,由于发出重定向的[R]标志,它的工作原理并非如此。重定向开始一个新的请求/响应周期,任何RewriteRules将从头开始。无论有没有[L]标志,都会发生同样的事情。