我想#fragment
为客户端附加一个以读取某些 URL(并由 SPA 使用)。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^foo/? /foo#bar [QSA,NE,L,R=301]
</IfModule>
但是,由于#bar
是上面 URL 中的一个片段,它似乎被剥离并导致重定向循环。我也尝试过像RewriteRule ^foo/? /foo\#bar
.
有没有办法将其限制RewriteRule
为一个重定向?
- 我正在将其写入
.htaccess
目标目录中的文件。网络服务器是httpd -v
Server version: Apache/2.4.39
(centos)
你不能。片段仅由浏览器处理。它们永远不会传输到服务器。
问题不在于重定向响应。
/foo#bar
正在标头中正确地发送回客户端Location:
(该NE
标志通过防止#
在响应中进行 URL 编码来帮助此处)。问题是浏览器不会在重定向请求上将片段标识符发送回服务器(正如@Gerald 所说,“[片段] 永远不会传输到服务器”)。因此,服务器反复看到
/foo
,因此出现了重定向循环。对于丢失的片段标识符,您无能为力。从服务器的角度来看,您可能需要以其他方式更改 URL,可能是通过附加查询字符串参数。例如:
上面将 URL 参数附加
redirect=1
到重定向响应中,并且条件确保在进行重定向之前该参数不存在。但是,附加 URL 参数可能是不可取的。
由于这仅供 SPA 中的客户端使用,因此您应该使用JavaScript History API和
replaceState()
(或可能pushState()
的)方法将#bar
片段标识符附加到 URL 并触发客户端响应。不需要服务器端重定向。