如何排除GET变量并重写URL?重定向遇500错误求助
解决Apache Rewrite导致的500错误及URL重定向问题
看起来你遇到的是Apache Rewrite规则无限循环引发的500错误,结合你描述的场景——重写基准为/folder/,/folder/item能正常跳转但/folder/item/2触发错误,我来拆解下问题根源和解决思路:
问题核心分析
500错误大概率是重写规则循环匹配导致的:服务器执行重写后,新生成的URL又被同一条规则再次触发,反复重写直到达到服务器的重写次数上限,最终返回500错误。比如如果你的规则没有排除真实存在的.php文件,重写后的item.php会被再次匹配,陷入循环。
针对性解决规则
根据你的需求,分两种场景编写规则:
场景1:.htaccess放在/folder/目录下
RewriteEngine On RewriteBase /folder/ # 先排除真实存在的文件和目录,避免无效重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 处理不带参数的URL:比如 /folder/create → /folder/create.php RewriteRule ^([^/]+)$ $1.php [L] # 处理带参数的URL:比如 /folder/item/2 → /folder/item.php?id=2 RewriteRule ^([^/]+)/([0-9]+)$ $1.php?id=$2 [L]
场景2:.htaccess放在网站根目录
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^folder/([^/]+)$ /folder/$1.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^folder/([^/]+)/([0-9]+)$ /folder/$1.php?id=$2 [L]
规则关键说明
RewriteCond %{REQUEST_FILENAME} !-f:跳过真实存在的文件(比如已有的create.php),避免循环RewriteCond %{REQUEST_FILENAME} !-d:跳过真实存在的目录[^/]+:匹配不含斜杠的字符串,确保只捕获URL的第一个路径段(比如item)[0-9]+:匹配数字参数,如果你的参数包含非数字字符,可改成.+(注意避免匹配到斜杠)[L]:标记为最后一条规则,避免后续规则重复处理
调试建议
如果还是出现错误,可以开启Apache的Rewrite日志定位问题:
在Apache配置文件(如httpd.conf或apache2.conf)中添加:
RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3
日志会记录每一次重写的详细过程,帮你找到循环触发的具体节点。注意生产环境要调低日志级别或关闭,避免影响性能。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

