如何解决Apache mod_rewrite 向查询字符串添加锚点
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
指令中的nocase
(RewriteRule
标志)是多余的,因为无论如何您都在匹配“所有内容”(即.*
)。无论如何,我敢打赌这完全是多余的,因为您没有在前面需要的情况下使用NC
标志 - 如果有的话。 -
(.*)
- 在发布的规则中,不需要带括号的子模式(捕获组),因为没有在任何地方使用反向引用。 -
RewriteCond %{REQUEST_URI} ^/foo$
- 不需要此条件,因为可以在RewriteRule
模式 中更有效地执行 URL 路径。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。