如何实现含c-前缀的URL301重定向并规避Rewrite规则冲突
我来帮你搞定这个Rewrite规则的问题,核心是要调整规则的执行顺序,并且正确使用捕获组语法,避免之前的错误。
正确的规则配置方案
Rewrite规则是从上到下依次执行的,重定向规则必须放在内部转发规则的最前面,这样才能优先触发301跳转,不会被后面的规则拦截。按照以下顺序配置即可解决问题:
1. 优先匹配c-开头的URL,执行301重定向
你之前的错误是在目标路径里误用了正则表达式语法,正确的写法应该用捕获组变量来引用匹配到的内容:
# 将c-xxx/springkussen-in-xxx/ 永久重定向到verhuur/springkussen-in-xxx/ RewriteRule ^c-[\w-]+/([\w-]+)/?$ /verhuur/$1/ [R=301,QSA,L]
- 细节说明:
^c-[\w-]+/:精准匹配以c-开头的第一段路径(比如c-4344196)([\w-]+):捕获第二段的别名内容(比如springkussen-in-gorinchem),用$1在目标路径中引用[R=301,QSA,L]:R=301标记永久重定向,QSA保留原URL的查询参数,L表示执行完这条规则后停止后续匹配
2. 处理verhuur开头的URL,内部转发到lp.php
这条规则要紧跟在重定向规则之后,确保verhuur的URL不会被后面的product-page规则误匹配:
# 将verhuur/springkussen-in-xxx/ 转发到lp.php RewriteRule ^verhuur/([\w-]+)/?$ /lp.php?alias=$1 [QSA,L]
3. 保留原有的product-page.php规则
最后放置原来的规则,这样只有不符合前两条规则的xxx/xxx格式URL才会走到这里:
# 处理其他普通的xxx/xxx格式URL RewriteRule ^([\w-]+)/([\w-]+)/?$ /product-page.php?cat=$1&alias=$2 [QSA,L]
你之前的规则出错原因
你写的verhuur/(.*)?alias=$2是语法错误:目标路径里不能直接写正则表达式(.*),它会被当作字面量输出到地址栏,所以才会出现verhuur/(.*)?alias=springkussen-in-schiedam的错误结果,必须用捕获组变量$1、$2来引用匹配到的内容。
测试小技巧
配置完成后记得清空浏览器缓存(301重定向会被浏览器持久缓存),也可以用命令行测试:
curl -I http://你的域名/c-4344196/springkussen-in-gorinchem/
正常情况下会返回HTTP/1.1 301 Moved Permanently,并且Location头指向正确的verhuur路径。
内容的提问来源于stack exchange,提问作者twan
相关产品推荐
相关产品推荐

