Regex htaccess[L]标志没有';行不通

Regex htaccess[L]标志没有';行不通,regex,apache,.htaccess,Regex,Apache,.htaccess,我在xampps的htdocs中的searchEngine文件夹中有这样的.htaccess文件 RewriteEngine On RewriteRule ^\/?test$ view/index.php [NC,L] RewriteRule ^(.*)$ http://google.com [NC,L] 然后我在地址栏中键入: 本地主机/搜索引擎/测试 为什么要重定向到 不是 view/index.php 我认为这必须被重定向到 view/inde

我在xampps的htdocs中的searchEngine文件夹中有这样的.htaccess文件

    RewriteEngine On
    RewriteRule ^\/?test$ view/index.php [NC,L]
    RewriteRule ^(.*)$   http://google.com [NC,L]
然后我在地址栏中键入:

  • 本地主机/搜索引擎/测试
为什么要重定向到

不是

  • view/index.php
我认为这必须被重定向到

  • view/index.php
不是


    • 这是因为
      mod\u rewrite
      在循环中运行。第一条规则是这样做:

      起始URL:

      /searchEngine/test
      
      /searchEngine/view/index.php
      
      结束URL:

      /searchEngine/view/index.php
      
      现在
      L
      标志导致
      mod_rewrite
      再次循环。因此,现在您的起始URL变为:

      起始URL:

      /searchEngine/test
      
      /searchEngine/view/index.php
      
      现在,第一条规则的模式
      ^test
      不匹配,但您的第二条规则使用
      *
      作为匹配模式,因此重定向到
      google

      您可以使用以下规则来防止这种行为:

      RewriteEngine On
      
      RewriteRule ^/?test$ view/index.php [NC,L]
      
      RewriteCond %{ENV:REDIRECT_STATUS} ^$
      RewriteRule ^ http://google.com [R,L]
      
      第二条规则有以下附加条件:

      RewriteCond %{ENV:REDIRECT_STATUS} ^$
      
      执行第一条规则后,
      REDIRECT\u STATUS
      设置为
      200
      。所以第二条规则只有在第一条规则没有首先执行时才会重定向,因此它将跳过
      /test

      如果您使用的是Apache 2.4+,则可以使用
      END
      而不是
      L
      来结束执行:

      RewriteEngine On
      
      RewriteRule ^/?test$ view/index.php [NC,END]
      
      RewriteRule ^ http://google.com [R,L]
      

      发生这种情况是因为内部重定向,您可以使用结束标志而不是L来停止此行为:

          RewriteEngine On
          RewriteRule ^\/?test$ view/index.php [NC,END]
          RewriteRule ^(.*)$   http://google.com [NC,L]
      

      L标志实际上是做什么的。我读了一份文件,上面写着:“最后一站处理规则”。我认为停止处理意味着停止循环它不会中断循环,而是充当循环的继续,因此循环从开始就再次执行。结束标志是否中断循环?是的,它立即终止规则处理。