Apache中UserDir与RedirectMatch的异常交互(多斜杠重定向问题)
Apache中UserDir与RedirectMatch的异常交互(多斜杠重定向问题)
我太懂你这种明明规则写得看起来没问题,但就是完全没效果的抓狂感了!咱们先把问题根因捋清楚,再给你解决办法。
首先,为啥你写的RedirectMatch permanent ^/~myname//+(.*)$ /~myname/$1完全没反应?这是因为Apache的UserDir模块会在请求处理的早期阶段,就自动把URI里的多个连续斜杠合并成单个斜杠了。等你的RedirectMatch规则触发的时候,请求的URI已经被规范化成/~myname/somestuff了,你的规则自然匹配不到任何请求,看起来就像没加一样。
那该怎么解决?核心思路是让重定向规则在UserDir规范化之前就生效,这里用<Location>或者<LocationMatch>块就能实现,因为它们是在请求刚进入Apache、还没被任何模块做规范化处理的时候就执行的。
针对单个用户(比如你的myname)的解决方案
把规则放在<Location>块里,这样能精准拦截原始的多斜杠请求:
<Location "/~myname//"> RedirectMatch permanent ^/~myname//+(.*)$ /~myname/$1 </Location>
针对所有UserDir用户的通用解决方案
如果想给所有用户都处理多斜杠问题,可以用<LocationMatch>来匹配任意用户的多斜杠请求:
<LocationMatch "^/~[^/]+//"> RedirectMatch permanent ^/~([^/]+)//+(.*)$ /~$1/$2 </LocationMatch>
配置完之后,记得重启Apache服务,再去测试http://www.example.tld/~myname//somestuff,应该会立刻301重定向到单斜杠的规范地址,Google爬虫也不会再识别成重复内容了。
备注:内容来源于stack exchange,提问作者Gro-Tsen
相关产品推荐
相关产品推荐

