我的情况比较奇怪。我有一个三行.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.
我尝试了我在这里找到的所有类似的线程,但找不到任何有用的东西。我可能只是绕着一些我无法注意到的东西走路。
答案 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]