在我的.htaccess文件中,我有:
RewriteEngine On
RewriteBase /
RewriteRule ^([^/]+)/?$ index.php?ToDo=$1 [L,QSA]
执行print_r($ _ GET)时,输出
Array ( [ToDo] => index.php )
然而,当我将重写规则更改为
时^([^/.]+)/?$ index.php?ToDo=$1 [L,QSA]
print_r然后输出$ _GET是一个空数组。有人可以向我解释为什么会这样吗?
答案 0 :(得分:4)
我们举一个例子URI /abc
:
你的第一个正则表达式:
^([^/]+)/?$
匹配/abc
并将其重写为:
/index.php?ToDo=abc
现在mod_rewrite
引擎再次运行并再次匹配URI ^([^/]+)/?$
的正则表达式/index.php
,并将其重写为:
/index.php?ToDo=index.php
你的第二个正则表达式:
^([^/.]+)/?$
工作正常,因为它与/index.php
URI不匹配。
编写此规则的最佳方法是这样的:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?ToDo=$1 [L,QSA]
如果请求是针对有效文件或目录,则这两行RewriteCond
行将阻止重写。