为什么$ _GET = index.php

时间:2014-07-17 18:46:18

标签: php regex .htaccess mod-rewrite

在我的.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是一个空数组。有人可以向我解释为什么会这样吗?

1 个答案:

答案 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行将阻止重写。