Apache.htaccess重写URL实现路径隐藏后旧URL仍可访问如何解决?
问题原因
你遇到的无限循环是因为两条规则冲突:
- 你添加的旧路径转新路径的重定向规则,会把
/blog/mynewpage301跳转到/mynewpage - 原来的内部重写规则,又会把
/mynewpage在服务端内部转发到/blog/mynewpage
两条规则循环触发,就会出现重定向次数过多的报错。
解决方案
核心是通过THE_REQUEST服务器变量区分「用户主动请求旧路径」和「服务端内部重写跳转的旧路径」:THE_REQUEST存储的是浏览器发送的原始请求内容,服务端内部重写时不会修改这个变量,所以可以作为判断依据。
你需要调整规则的顺序,把重定向规则放在内部重写规则之前,完整规则如下:
# 第一条:拦截用户直接访问旧路径的请求,301跳转到新路径 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /blog/mynewpage/ [NC] RewriteRule ^blog/mynewpage/$ /mynewpage/ [R=301,L] # 第二条:原来的内部重写规则,保持不变 RewriteRule ^mynewpage/$ /blog/mynewpage/ [L]
通用扩展(可选)
如果你后续有多个页面需要做同样的映射,不需要逐个写规则,可以直接用通用规则适配所有/blog下的内容:
# 所有用户直接访问/blog/xxx的请求,都跳转到/xxx RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /blog/([^\ ]*) [NC] RewriteRule ^blog/(.*)$ /$1 [R=301,L] # 所有根路径下不存在的静态文件/目录,都内部转发到/blog路径下匹配 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /blog/$1 [L]
注意:修改规则后请清理浏览器缓存再测试,301永久重定向会被浏览器默认缓存,未清理缓存可能会看到之前的错误跳转结果。
内容的提问来源于stack exchange,提问作者FbnKlmn
相关产品推荐
相关产品推荐

