htaccess重写规则移除URL文件夹名不生效 仅第一条可用报错500
问题原因
- 存在重写循环:现有规则的逻辑是只要请求的文件/目录不存在,就统一重写到排在最上方的文件夹路径下。[L]标记只会停止当前轮次的重写,重写后的请求会重新触发整个重写流程,无限循环触发Apache重写次数上限后就会返回500错误。
- 多文件夹匹配逻辑缺失:规则没有判断目标文件在对应文件夹是否真实存在,所有未命中本地文件的请求都会被第一条规则拦截,排在后面的规则永远不会触发。
- 拼写错误:beauty文件夹的重写路径误写为
/buety/$1,也会导致资源访问失败。
修复方案
删除各子文件夹下的重写规则,只在网站根目录下创建.htaccess文件,写入以下配置即可:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 匹配food文件夹下的文件 RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{DOCUMENT_ROOT}/food/$1 -f RewriteRule ^(.+)$ /food/$1 [NC,L] # 匹配health文件夹下的文件 RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{DOCUMENT_ROOT}/health/$1 -f RewriteRule ^(.+)$ /health/$1 [NC,L] # 匹配beauty文件夹下的文件 RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{DOCUMENT_ROOT}/beauty/$1 -f RewriteRule ^(.+)$ /beauty/$1 [NC,L] </IfModule>
配置说明
RewriteCond %{ENV:REDIRECT_STATUS} ^$用于过滤已经完成重写的请求,只有用户发起的原始请求才会走重写逻辑,从根源避免重写循环。- 新增目标文件存在校验:每次重写前会先检查请求的文件名是否在对应文件夹下真实存在,存在才执行重写,不存在则继续匹配下一个文件夹的规则。
- 已修正beauty文件夹的拼写错误,确保路径正确。
- 如果后续新增其他分类文件夹,按照上面的格式新增对应规则块即可,优先级高的文件夹规则放在前面即可,注意同名文件会优先匹配排在前面的文件夹中的资源。
内容的提问来源于stack exchange,提问作者coder2022
相关产品推荐
相关产品推荐

