Mod Rewrite L Flag不停止

时间:2016-03-29 19:10:03

标签: regex apache .htaccess mod-rewrite

为什么:

http://example.com/robots.txt

重定向到:

http://www.example.com/mvc/view/robots/live-robots.txt

遵守这些规则:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com
RewriteRule ^robots.txt /mvc/view/robots/live-robots.txt [L]
#.... 20 irrelevant lines for mobile rewrites
# Force the "www."
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
然而

加载它:

http://www.example.com/robots.txt

按预期重写live-robots.txt

L标志是否应该在两种情况下都停止重定向,而不是达到后一条规则?

  

在此上下文中,L标志可用于结束当前一轮mod_rewrite处理。

https://httpd.apache.org/docs/current/rewrite/flags.html

当前执行路径:

  1. http://example.com/robots.txt
  2. 301服务
  3. http://www.example.com/mvc/view/robots/live-robots.txt
  4. 然后

    1. http://www.example.com/robots.txt
    2. 200(提供mvc / view / robots / live-robots.txt的内容)
    3. 我非常确定它不是正则表达式问题,但也在这里进行测试,https://regex101.com/r/eI9aC4/1

1 个答案:

答案 0 :(得分:1)

标记L不会阻止其他规则执行。它只是在continue循环中充当while,并使mod_rewrite循环再次运行。

您的规则需要按顺序颠倒过来。通常在内部重写规则之前保留重定向规则:

RewriteEngine On
RewriteBase /

# Force the "www."
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^robots\.txt$ mvc/view/robots/live-robots.txt [L,NC]
#.... 20 irrelevant lines for mobile rewrites

确保清除浏览器缓存以进行此更改。

但是,如果你有Apache 2.4+,那么你可以使用END标志来完全停止以下所有规则:

RewriteRule ^robots\.txt$ mvc/view/robots/live-robots.txt [END]