.htaccess和$ _GET混淆

时间:2014-08-18 21:14:46

标签: php .htaccess get

我的情况比较奇怪。我有一个三行.htaccess,它是:

RewriteEngine On
RewriteRule ^/([A-Za-z0-9-]+)/?$ $1.php [NC]
RewriteRule ^/signup/([A-Za-z0-9-]+)/?$ /signup.php?step=$1 [L,QSA]

一个简单的算法:

if (empty($_GET["step"])) 
    { don't do anything } 
else 
    {  if ($_GET["step"] == 'step2')
          { do something } ..

现在,如果我使用signup.php?step=step2,我会得到预期结果,但如果我使用signup/step2/,则var_dump( $_GET )会返回0.

我尝试了我在这里找到的所有类似的线程,但找不到任何有用的东西。我可能只是绕着一些我无法注意到的东西走路。

3 个答案:

答案 0 :(得分:2)

如果您使用的是apache 2.0或更高版本,则必须从模式中删除前导/,因为重写引擎会在中应用规则之前将其删除目录上下文,htaccess文件中的规则都是每个目录(即htaccess文件所在的目录)。

此外,如果您打算在末尾添加.php扩展名,则必须检查文件是否确实存在,否则任何404都会导致500服务器错误。你也应该最后

RewriteEngine On

RewriteRule ^signup/([A-Za-z0-9-]+)/?$ /signup.php?step=$1 [L,QSA]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.php [L]

答案 1 :(得分:1)

您的代码中存在一些错误。

将其替换为

Options -MultiViews

RewriteEngine On
RewriteBase /

RewriteRule ^([^/]+)/?$ $1.php [L,NC]
RewriteRule ^signup/([^/]+)/?$ signup.php?step=$1 [L,NC]

答案 2 :(得分:0)

答案是Jon和Justin的答案。

Options -MultiViews

RewriteEngine On
RewriteBase /
RewriteRule ^signup/([^/]+)/?$ signup.php?step=$1 [L,NC]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.php [L]