RewriteRule取反规则失效求助:URL重定向需求无法实现
解决Apache URL重定向:将/about/下非精确匹配的URL定向到/about/apple
我来帮你搞定这个重定向问题!你之前的写法踩了几个正则和RewriteRule的小坑,咱们一步步来解决:
正确的规则写法
首先确保你的配置里已经开启了RewriteEngine,然后用下面的规则就能满足你的需求:
RewriteEngine On # 重定向所有/about/开头但不是精确匹配/about/apple的URL RewriteCond %{REQUEST_URI} !^/about/apple$ RewriteRule ^about/ /about/apple [R=301,L]
或者用单条RewriteRule结合负向预查的紧凑写法:
RewriteEngine On # 匹配/about/后不是"apple"结尾的所有路径 RewriteRule ^about/(?!apple$).* /about/apple [R=301,L]
这两个规则都能把/about/apple/1、/about/green、/about/apples、/about/pears/1这些URL全部重定向到/about/apple,同时不会影响精确匹配的/about/apple本身。
为什么你之前的写法不生效?
咱们来拆解下你踩的坑:
^about/(!apple):这里的!不是正则的语法,正则里的负向预查需要用(?!...),这个写法会把!apple当成字面量去匹配,自然不会触发任何重定向。^about/(?!apple):这个规则的问题是,它只匹配/about/后面不是以apple开头的路径,比如/about/green会匹配,但/about/apple/1因为后面是apple开头,所以不会被匹配,这就漏掉了你要重定向的/about/apple/1这类URL。RewriteCond %{REQUEST_FILENAME} !(about/apple):%{REQUEST_FILENAME}是请求对应的文件系统路径,不是URL路径,所以这个条件判断的是文件/目录是否叫about/apple,和URL重定向的需求不匹配。
重要提醒
测试的时候一定要清除浏览器缓存!因为301是永久重定向,浏览器会缓存之前的重定向结果,可能导致你修改规则后看不到效果。如果不想缓存,可以先把R=301改成R=302(临时重定向),测试没问题再改回301。
内容的提问来源于stack exchange,提问作者cirrus123
相关产品推荐
相关产品推荐

