我已经读到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
。
答案 0 :(得分:2)
$1
按预期工作,但问题是您使用此模式:
(.*)
匹配任何东西。您的重写规则实际上会循环并运行两次,因为您没有任何RewriteCond
来预设循环。
some/url
,URI变为index.php
而$1
变为some/url
index.php
而$1
变为index.php
您可以使用此规则来解决此问题:
# 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
。