Apache的RewriteRule的$ 1替换不会返回第一个匹配的表达式

时间:2016-08-22 03:08:31

标签: apache .htaccess mod-rewrite url-rewriting friendly-url

我已经读到Apache的Rewrite Engine中的模式替换正常工作,正如预期的正则表达式所做的那样,所以我尝试了:

的.htaccess
RewriteRule (.*) index.php?route=$1

但是对于get var 路线 domain.com/some/url的请求,我得index.php而不是some/url

在http var REDIRECT_QUERY_STRING中,我得到route=some/url
但是在QUERY_STRING我得到route=index.php

这里有什么问题?

PS:$0也会返回index.php
如果我使用RewriteRule . index.php?route=$1,则无论请求网址是什么,我都会获得route = i

1 个答案:

答案 0 :(得分:2)

$1按预期工作,但问题是您使用此模式:

(.*)

匹配任何东西。您的重写规则实际上会循环并运行两次,因为您没有任何RewriteCond来预设循环。

  1. 首先运行URI = some/url,URI变为index.php$1变为some/url
  2. 第二次运行URI = index.php$1变为index.php
  3. 您可以使用此规则来解决此问题:

    # If the request is not for a valid directory
    RewriteCond %{REQUEST_FILENAME} !-d
    # If the request is not for a valid file
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*) index.php?route=$1 [L,QSA]
    

    如果您想将现有文件和目录重写为index.php,请使用:

    RewriteRule ^((?!index\.php$).*)$ index.php?route=$1 [L,QSA,NC]
    

    这会将除index.php之外的所有内容重写为index.php