为什么$_GET = index.php

在我的.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行将阻止重写.

上一篇:php-目录保护在我的https网站上两次要求输入密码?


下一篇:php-如果url不包含某些字符串,则htaccess重定向