Apache 服务器上 .htaccess 文件中 RewriteRules 的优先级

Apache 服务器上 .htaccess 文件中 RewriteRules 的优先级

我的 .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 标志的作用。

相关内容