Apache 重定向到相同路径,但带有 # 片段

Apache 重定向到相同路径,但带有 # 片段

我想附加一个#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=1URL 参数附加到重定向响应,并且条件确保在进行重定向之前该参数不存在。

但是,附加 URL 参数可能并不可取。

由于这仅供 SPA 中的客户端使用,因此您应该使用JavaScript 历史记录 APIreplaceState()(或者可能pushState()) 方法将#bar片段标识符附加到 URL 并触发客户端响应。无需服务器端重定向。

答案2

不能。片段仅由浏览器处理。它们永远不会传输到服务器。

相关内容