.htaccess and $_GET confusion


.htaccess and $_GET confusion

我这里有一个相当奇怪的情况。我有一个三行的。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。

我尝试了我在这里找到的所有类似的线程,但找不到任何工作。我可能只是在绕着我自己都没注意到的东西转圈。

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

此外,如果您打算在末尾添加.php扩展名,则必须检查文件是否实际存在,否则任何404都将导致500服务器错误。last:
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]

您的代码中有一些错误。

用这个替换

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

答案是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]