我的 .htaccess 文件中有许多 RewriteRules。但是,无论我如何排列这两条规则,只有删除一条特定规则时,才会执行另一条特定规则。
以下是似乎具有“较低”优先级的规则:
RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L]
这里有一条始终优先的规则:
RewriteCond %{HTTP_HOST} ^domain1\.net$ [NC]
RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L]
domain1 和 domain2 实际上都指向同一个网站。因此,每当两条规则都在 .htaccess 文件中并且我访问
http://domain1.net/123
第二条规则首先执行,我得到了两个重定向,第一个重定向到http://domain2.net/123然后(当主机名不再符合第二条规则时)http://domain2.net/beta/forward.php?id=123。我尝试修复第二条规则,使其永远不会对仅包含数字的 URL 执行,但我一定是做错了什么,因为它仍然被执行:
RewriteCond %{HTTP_HOST} ^ domain1\.net$ [NC]
RewriteRule ^(.*[^0-9]+.*)$ http://domain2.net/$1 [R=301,L]
只有从 .htaccess 文件中删除两行,我才能获得第一条规则来立即处理请求。
任何帮助将不胜感激。
答案1
您的规则表明了这些程序:
如果 URL 只有数字,请转到测试版 URL,然后跟着这些数字,然后停止。
如果您访问域 1,则转到域 2 上的相同 URL 并停止。
当L
遇到 或规则完成后,处理结束。其他任何事情都是来自浏览器的新连接。这可能就是让您感到困惑的地方——顺序很重要,然后是匹配。L
当它们按顺序排列时,应该可以解决您遇到的问题:
RewriteEngine on
RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L]
# 如果只是数字,则结束处理 [L]
RewriteCond %{HTTP_HOST} ^domain1\.net$ [NC]
# 如果不区分大小写匹配 domain1.net…
RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L]
# 重定向到 domain2.net。结束 [L]
答案2
我认为你应该检查重写规则的标志(http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule)注意 C 和 L 标志的作用。