在我的.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是一个空数组.有人可以向我解释为什么会这样吗?
解决方法:
让我们以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行将阻止重写.