Apache mod_rewrite 在第一个条件满足后停止

Apache mod_rewrite 在第一个条件满足后停止

我正在尝试将该 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 如何处理您的规则。

相关内容