Htaccess URL重写规则故障:不存在页面不返回404、跳转异常
问题2根因分析
你现有规则的正则写法存在匹配范围漏洞:(^azazaz|placeholdercateg) 里的起始符^只作用于第一个选项azazaz,没有作用于第二个选项placeholdercateg,导致只要URL任意位置出现placeholdercateg字符串就会命中重写规则,不管前面有没有其他路径。同时第二条规则里的^写在分组中间位置,属于语法逻辑错误,进一步扩大了匹配范围。
修复方案
修改后的完整.htaccess规则如下:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Https跳转 Options All -Indexes # 禁止服务器文件目录索引 # 第一层级分类匹配:强制分类名必须在URL根路径第一层级 RewriteRule ^(azazaz|placeholdercateg)/?([0-9]+)?/?$ /index.php?category=$1&page=$2 [NC,L] # 第二层级动作匹配:强制动作名必须在分类名的下一层级 RewriteRule ^(azazaz|placeholdercateg)/(azaza|placeholderaction)/?([0-9]+)/?([0-9]+)?$ /index.php?category=$1&action=$2&id=$3&postid=$4 [NC,L] # 兜底404规则:未命中以上规则且无对应实体文件/目录的请求直接返回404 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ - [R=404,L]
修改点说明
- 将原分组内的
^移到规则最开头,让两个分类选项都被限制在URL根路径第一层级,前面加任意路径的请求都不会命中该规则 - 删除了第二条规则分组内错误的
^符,调整为「分类+动作」的层级匹配逻辑,避免匹配位置混乱 - 新增兜底404规则,所有无对应实体资源、且未命中前面重写规则的请求直接返回404,如果你有自定义404页面,可以将最后一条规则替换为
RewriteRule ^ /你的自定义404页面路径 [R=404,L]
内容的提问来源于stack exchange,提问作者MisatoIsMyWife
相关产品推荐
相关产品推荐

