我正在尝试将该 URL 重写如下:
fr.example.com/tag/movies
»example.com/catch.php?country=fr&tag=movies
example.com/tag/movies
»example.com/catch.php?tag=movies
fr.example.com
»domain.com/catch.php?country=fr
对于这些,我在 .htaccess 文件中有以下 mod_rewrite 规则
子域名 + 标签
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com [NC] RewriteRule ^tag/([^/]+) catch.php?country=%1&tag=$1 [L,NS]
标签
RewriteRule ^tag/([^/]+) catch.php?tag=$1 [L,NS]
子域名
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com [NC] RewriteRule ^(.*)$ catch.php?country=%1 [L,NS]
完全按照这个顺序。
现在,L
第一个之后的RewriteRule
应该结束处理并将其重定向到子域+标签 URL,但事实并非如此。例如,fr.example.com/tag/movies
发送到catch.php?country=fr
,这是文件中的最后一个条件.htaccess
。
L
找到第一个之后它不应该停止吗?
回答
嗯,事实证明,该[L]
标志的工作方式根据上下文而不同(.htaccess
/<Directory>
不同于httpd.conf
),如您所见这里。
因此,要使其工作,只需将规则放在<VirtualHost>
(NOT ) 内,并向每个 URI ( 、 、...)<Directory>
添加 即可。就是这样。/
/catch.php
/tag
答案1
L 标志不会在任何情况下停止处理。我建议查看这Stack Overflow 上的线程,特别是 Apache Rewrite Guide 的链接,以及打开 RewriteLog,以便您可以确认 mod_rewrite 如何处理您的规则。