微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache mod_rewrite 向查询字符串添加锚点

如何解决Apache mod_rewrite 向查询字符串添加锚点

我正在尝试使用查询字符串向 URL 添加锚点。原始网址是

https://example.com/foo?query=123

它应该重定向

https://example.com/foo?query=123#anchor

这些是我在 .htaccess 文件中的规则:

RewriteCond %{REQUEST_URI} ^/foo$
RewriteCond %{QUERY_STRING}  ^query=[a-zA-Z0-9\s]*$
RewriteRule (.*) /foo?%{QUERY_STRING}#anchor [NC,NE,R=302,L,END]

您知道如何避免重定向循环吗?

解决方法

根据您展示的样品,您可以尝试以下操作吗? 在测试您的网址之前,请务必清除浏览器缓存。

RewriteEngine ON
RewriteCond %{THE_REQUEST} \s/([\w-]+\?query=\d+)\s [NC]
RewriteRule ^ %1#anchor [L,R,NE]
,

您知道如何避免重定向循环吗?

这对于服务器端 (Apache / .htaccess) 重定向是不可能的,无需以某种方式更改 URL 路径或查询字符串。

#anchor(或片段标识符)未在重定向请求中传递给服务器,因此 相同 URL 匹配您的规则并触发另一个重定向一次又一次地附加 #anchor,等等。

当您请求 /foo?query=123 时,请求被 302 重定向到 /foo?query=123#anchor(您发布的规则已经这样做了)。但是,浏览器仅在重定向的请求中将 /foo?query=123(无片段标识符)发送回,因此该过程重新开始。

防止“服务器端”重定向中出现重定向循环的唯一方法是以某种方式更改 URL 的其他元素,然后您可以在规则中检测到这些元素。例如。重定向到 /bar?query=123#anchor/foo?query=123&noredirect=1#anchor

但是,片段标识符 (#anchors) 仅由客户端脚本/HTML 使用,因此如果 URL 上需要 #anchor,则应改为使用 JavaScript 添加。


旁白:关于您现有规则的一些说明:

RewriteCond %{REQUEST_URI} ^/foo$
RewriteCond %{QUERY_STRING}  ^query=[a-zA-Z0-9\s]*$
RewriteRule (.*) /foo?%{QUERY_STRING}#anchor [NC,NE,R=302,L,END]
  • 无需同时使用 L END 标志。 L 标志停止当前轮次处理,END 标志停止重写引擎的所有进一步处理。但是,当与 R 标志一起使用时,它们的行为完全相同 - 无论您使用 L 还是 END 标志,所有进一步处理都会停止。

  • query=[a-zA-Z0-9\s]*$ - 您使用了 \s (空白)速记字符类 - 这是多余的,因为它永远不会在这里匹配。 (您的查询字符串值实际上可以包含空格吗?)QUERY_STRING 服务器变量是 % 编码的,因此从不存在文字空格。请求的查询字符串中的任何空格都将被 URL 编码为 %20+

  • NC 指令中的 nocaseRewriteRule 标志)是多余的,因为无论如何您都在匹配“所有内容”(即 .*)。无论如何,我敢打赌这完全是多余的,因为您没有在前面需要的情况下使用 NC 标志 - 如果有的话。

  • (.*) - 在发布的规则中,不需要带括号的子模式(捕获组),因为没有在任何地方使用反向引用。

  • RewriteCond %{REQUEST_URI} ^/foo$ - 不需要此条件,因为可以在 RewriteRule 模式 中更有效地执行 URL 路径。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。