.htaccess配置伪静态添加查询字符串规则出现500错误
解决伪静态规则导致的500服务器错误
首先,咱们得搞清楚为什么会出现500错误——问题出在你新增的RewriteRule上,它触发了无限重定向循环。
错误原因分析
你原来的两个RewriteCond只对紧跟的第一个RewriteRule生效,而新增的第二个RewriteRule没有任何条件限制,而且匹配规则^([^-]*)$范围太广:
- 当用户请求
/something时,规则会把它重定向到/listing?url=something - 但
/listing本身也符合^([^-]*)$的匹配规则(因为里面没有减号),于是服务器又会把/listing重定向到/listing?url=listing - 这个过程会无限重复,服务器最终返回500错误来终止循环
针对不同需求的修复方案
需求1:两种规则共存(部分路径用.php后缀移除,部分用/xxx转成/listing?url=xxx)
如果你想保留原有移除.php后缀的功能,同时新增/xxx转/listing?url=xxx的规则,需要给新规则添加条件,排除/listing本身,并且限定匹配的路径:
RewriteEngine On # 原有规则:移除.php后缀 RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] # 新增规则:将/xxx重定向到/listing?url=xxx,排除/listing本身 RewriteCond %{REQUEST_URI} !^/listing$ RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}!-f RewriteRule ^([^/]+)$ /listing?url=$1 [L]
需求2:替换原有规则,所有符合条件的请求都转成/listing?url=xxx
如果你不再需要移除.php后缀的功能,只想实现/xxx对应/listing?url=xxx,需要添加条件避免循环,同时确保只处理实际不存在的文件/目录:
RewriteEngine On # 排除/listing本身,避免循环 RewriteCond %{REQUEST_URI} !^/listing$ # 确保请求的不是真实目录 RewriteCond %{REQUEST_FILENAME}!-d # 确保请求的不是真实文件 RewriteCond %{REQUEST_FILENAME}!-f # 匹配单个路径段(比如/xxx,不匹配/xxx/yyy) RewriteRule ^([^/]+)$ /listing?url=$1 [L]
关键注意点
- 每个
RewriteCond只对紧跟的下一个RewriteRule生效,所以一定要给每个规则配上对应的条件 - 必须排除目标路径(这里是
/listing),避免无限循环 - 用
[L]标记终止当前规则处理,防止后续规则继续干扰
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

