.htaccess配置友好URL时规则冲突致500错误求助
解决.htaccess中隐藏PHP扩展名与编辑规则冲突的500错误问题
这个问题的核心是重写规则的顺序和循环触发导致的,我来帮你拆解并解决:
为什么会出现500错误?
当两条规则同时启用时,第一条RewriteRule ^(.*)$ $1.php [NC]会优先匹配所有请求——包括你的编辑URL http://www.domainname.com/researcher/lists/edit/。它会把这个URL重写成/researcher/lists/edit/.php,这个文件显然不存在,更关键的是:重写后的URL会再次进入Apache的重写流程,反复循环直到超过默认的重写次数限制,最终抛出500内部服务器错误。
而当你注释掉这条规则时,编辑规则能正常匹配,因为没有被提前改写。
解决方案:调整规则顺序与添加终止标志
把编辑规则放在最前面,并给两条规则都加上L(Last)标志,确保匹配到对应规则后就停止后续重写,同时优化隐藏扩展名规则的条件避免循环。修改后的.htaccess如下:
Options -MultiViews RewriteEngine on RewriteBase / # 优先处理编辑规则,匹配后立即停止后续重写 RewriteRule ^(.*)/edit/(\d+)?$ $1/edit.php?tag=$2 [NC,L] # 处理PHP扩展名隐藏,同时避免循环与多余匹配 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L]
关键调整说明:
- 规则顺序:把编辑规则放在最前面,确保它先被匹配,不会被后面的扩展名隐藏规则干扰。
L标志:告诉Apache处理完当前规则后就停止后续的重写规则,避免不必要的重复处理。- 新增
!-f条件:确保当请求本身是一个已存在的文件(比如直接访问edit.php)时,不会触发扩展名隐藏的重写,彻底避免循环。
可选方案:排除编辑路径的匹配
如果你更倾向于保留原规则顺序,也可以在扩展名隐藏规则中排除包含/edit/的路径,这样编辑请求不会被改写:
Options -MultiViews RewriteEngine on RewriteBase / # 隐藏PHP扩展名,但跳过包含/edit/的请求 RewriteCond %{REQUEST_URI} !/edit/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L] # 处理编辑规则 RewriteRule ^(.*)/edit/(\d+)?$ $1/edit.php?tag=$2 [NC,L]
现在测试你的编辑链接http://www.domainname.com/researcher/lists/edit/,应该能正常跳转到researcher/lists/edit.php?tag=(因为\d+是可选参数,tag值为空符合你的规则设计),同时普通URL的PHP扩展名也能正常隐藏。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

