我想附加一个#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)
答案1
我也尝试过像这样转义哈希......
问题不在于重定向响应。/foo#bar
正在标题中正确地发送回客户端Location:
(NE
此处的标志有助于防止#
在响应中进行 URL 编码)。
问题是浏览器不会将片段标识符发送回服务器上重定向请求(正如@Gerald所说,“[片段]永远不会传输到服务器”)。因此,服务器反复看到/foo
,因此出现重定向循环。对于缺失的片段标识符,您无能为力。
从服务器角度来看,您需要以其他方式更改 URL,例如附加查询字符串参数。例如:
RewriteCond %{QUERY_STRING} !^redirect
RewriteRule ^foo/? /foo?redirect=1#bar [QSA,NE,R,L]
上述操作将redirect=1
URL 参数附加到重定向响应,并且条件确保在进行重定向之前该参数不存在。
但是,附加 URL 参数可能并不可取。
由于这仅供 SPA 中的客户端使用,因此您应该使用JavaScript 历史记录 API和replaceState()
(或者可能pushState()
) 方法将#bar
片段标识符附加到 URL 并触发客户端响应。无需服务器端重定向。
答案2
不能。片段仅由浏览器处理。它们永远不会传输到服务器。