没有Last 标志的一系列重写

更新:今天我发现问题是什么:现在看看更小的版本

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 /文件夹,如果我inputlocalhost / h / firstsecond,它返回本地/ landingpage1.php,模式不满足第四行, 如果我键入localhost / h / first / second,它=登陆localhost / landingpage2.php?id =本地主机/ landingpage1.php&嗨,实际上一次,只是一次我不知道如何,我发现在实验中,与本地/ h /第一/第二个url,redirect第一个重写代码行像localhost / landingpage1.php //第二,当然这样我们看到第二行的作品,我也看到这种与Alias“redirect”的行为,如果有什么文件夹跟踪到你的url,它增加剩下的部分与查询string一起放入最终的redirecturl。

所以当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] 

如果我inputlocalhost / h / anchor / text,那么我认为会发生什么

  1. 第一行RewriteRule anchor /(.+)/ hello [R,ENV = lang:hi]的模式“anchor /(.+)”匹配,所以它redirect到localhost / hello,但由于没有L标志,redirect到本地主机/你好是搁置,因此它下面

  2. 第二行的模式“锚”与新的http:// localhost / hello不匹配,所以这是跳过

  3. 第三行的模式/ hello与localhost / hello匹配,最后redirect到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 /富/酒吧,我以为这发生
1.第一行的模式“foo / bar”与url匹配,所以它redirect到http:// localhost / tmp1 /,但是因为没有L,所以它被搁置

  1. 第二行的模式“foo / bar”与http:// localhost / tmp1 /不匹配,所以跳过了(如果我除去前两个除外的所有行,最终redirect到http:// localhost / tmp1 /)

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

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

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

  5. 现在哪些东西旋转我的脑海最后3小时是第六线“酒吧”匹配..并redirect到http:// localhost / tmp7 /(删除最后2行确认)如何?

  6. 七分之一不符合预期

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

现在问题是为什么第6行的“酒吧”匹配,如果它可以匹配最古老的URLinput(http:// localhost / foo / bar),那么为什么它不匹配在同一个例子的第二行,为什么它不匹配在例1的第二行?

记住所有的目标模式指向文件夹之外(在父,www,使他们不能再次回到htaccess文件)

首先是一个很好的问题,有很多细节。

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

 add path info postfix: /landingpage1.php/second 

Apache.org上有一个针对这个问题的bug。

当您从RewriteRule省略LDPI (即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. 第一行的模式“foo / bar”与url匹配,所以它重定向到http:// localhost / tmp1 /,但是因为没有L,所以它被搁置

不,这不是因为[R]标志,它发出重定向的原因。 重定向开始一个新的请求/响应周期,任何RewriteRules将从头开始重新开始。 同样的事情会发生有或没有[L]标志。