Apache的Redirect permanent规则带#字符不生效问题咨询
问题成因
- URL中
#开头的部分属于片段标识符(Hash Fragment),是浏览器端专用的标识符,不会被发送到服务端。你在浏览器地址栏输入https://你的域名/primoacc/sigma/app/index#,实际Apache收到的请求路径只有/primoacc/sigma/app/index,完全不带后面的#字符。 - 你配置的
Redirect permanent /primoacc/sigma/app/index# ...的匹配规则要求路径包含#,但服务端永远收不到带#的对应请求,自然永远触发不了规则。 - 你把
#换成%23也无效的原因是:只有当#是作为URL路径的一部分(而非片段标识符)时,才会被编码为%23发送给服务端。用户直接在地址栏输入的#默认会被识别为片段标识符的开头,不会编码,也不会发送,所以匹配%23的规则同样无法命中普通用户输入的带#的URL。
解决方法
场景1:对所有访问/primoacc/sigma/app/index的请求(无论是否带hash)都重定向到目标地址
直接用你原本生效的配置即可,该规则会命中所有服务端收到的路径为/primoacc/sigma/app/index的请求,原地址带的任意hash都会被新的#/home覆盖:
Redirect permanent /primoacc/sigma/app/index https://example.com/primoacc/sigma/app/index#/home
场景2:需要区分用户是否带了hash,仅对带特定hash的请求做重定向
因为服务端无法获取hash内容,只能通过前端方案实现:
- 先在Apache配置中把
/primoacc/sigma/app/index的请求转发到对应前端页面 - 在页面中通过JS读取hash值,匹配后执行重定向:
// 示例:匹配hash为空或者仅为#的情况 if (location.hash === '' || location.hash === '#') { location.replace('https://example.com/primoacc/sigma/app/index#/home') }
场景3:需要匹配路径中确实包含#的请求(即用户访问的是/primoacc/sigma/app/index%23,#属于路径组成部分而非片段标识符)
可以用mod_rewrite规则匹配编码后的%23:
RewriteEngine On RewriteCond %{REQUEST_URI} ^/primoacc/sigma/app/index\%23$ [NC] RewriteRule ^(.*)$ https://example.com/primoacc/sigma/app/index#/home [L,R=301]
内容的提问来源于stack exchange,提问作者Gabriele
相关产品推荐
相关产品推荐

