为什么:
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
当前执行路径:
然后
我非常确定它不是正则表达式问题,但也在这里进行测试,https://regex101.com/r/eI9aC4/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]