.htaccess规则例外设置:portfolio页面特殊URL规则需求
解决.htaccess中Portfolio页面的规则例外问题
我来帮你搞定这个规则优先级的问题!其实核心原因很简单:.htaccess的重写规则是从上到下依次匹配的,你之前把Portfolio的新规则放在原有通用规则下面,导致请求Portfolio相关URL时,先触发了通用规则(把第二个参数识别成操作),自然新规则就没机会生效了。
正确的做法是把Portfolio的专属规则放在通用规则前面,并且用[L]标记让匹配到这条规则后就停止后续匹配。下面是具体的实现示例:
第一步:开启重写引擎(如果还没加的话)
RewriteEngine On
第二步:添加Portfolio页面的专属规则
这条规则会优先匹配所有/portfolio/分类/操作格式的URL,把分类和操作分别提取出来:
# 匹配 Portfolio 页面的「分类+操作」格式 RewriteRule ^portfolio/([^/]+)/(add|edit)$ index.php?page=portfolio&category=$1&action=$2 [L,QSA]
^portfolio/:匹配以portfolio/开头的URL([^/]+):捕获分类值(匹配除了斜杠之外的任意字符)(add|edit):仅允许add或edit两种操作[L]:表示这是最后一条要执行的规则,匹配到后不再往下走[QSA]:保留URL中原本的查询字符串(比如?id=123这类参数)
第三步:保留你的原有通用规则
这条规则会处理除了Portfolio之外的所有页面,因为Portfolio的请求已经被前面的规则拦截了:
# 通用页面的「页面+操作」格式(Portfolio除外) RewriteRule ^([^/]+)/(add|edit)$ index.php?page=$1&action=$2 [L,QSA]
测试验证
现在访问/portfolio/web-design/add,应该能在后端拿到参数:page=portfolio&category=web-design&action=add
而访问普通页面比如/blog/edit,依然会按原有规则解析成:page=blog&action=edit
如果你的原有规则有其他自定义参数或者URL格式,只需要调整正则表达式的对应部分就行,核心逻辑不变:例外规则优先,用[L]终止后续匹配。
内容的提问来源于stack exchange,提问作者IBMdig
相关产品推荐
相关产品推荐

