Apache mod_重写将锚添加到查询字符串
我正在尝试使用查询字符串向URL添加锚。原始URL是Apache mod_重写将锚添加到查询字符串,apache,.htaccess,redirect,mod-rewrite,url-rewriting,Apache,.htaccess,Redirect,Mod Rewrite,Url Rewriting,我正在尝试使用查询字符串向URL添加锚。原始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_ST
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]
您知道如何避免重定向循环吗?对于所显示的示例,请尝试以下内容。 请确保在测试URL之前清除浏览器缓存
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
等
但是,片段标识符(#锚定
)仅由客户端脚本/HTML使用,因此如果URL上需要#锚定
,则应使用JavaScript添加
旁白:关于您现有的规则,请注意以下几点:
- 无需同时使用
和L
标志。END
标志停止当前一轮处理,L
标志停止重写引擎的所有进一步处理。但是,当与END
标志一起使用时,它们的行为完全相同-无论您使用R
还是L
标志,所有进一步的处理都将停止END
-您使用了query=[a-zA-Z0-9\s]*$
(空白)速记字符类-这是多余的,因为它在这里永远不会匹配。(您的查询字符串值是否真的包含空格?)服务器变量\s
是%-编码的,因此不存在文本空格。请求的查询字符串中的任何空格都将被URL编码为query\u string
或%20
+
指令上的RewriteRule
(NC
标志)是多余的,因为您无论如何都要匹配“所有内容”(即nocase
)。我敢打赌这是完全多余的,因为您没有在前面的条件下使用*
标志,如果需要的话NC
-在发布的规则中,不需要括号内的子模式(捕获组),因为任何地方都没有使用反向引用(.*)
-不需要此条件,因为在RewriteCond%{REQUEST\u URI}^/foo$
模式中可以更有效地执行URL路径RewriteRule
RewriteCond %{REQUEST_URI} ^/foo$
RewriteCond %{QUERY_STRING} ^query=[a-zA-Z0-9\s]*$
RewriteRule (.*) /foo?%{QUERY_STRING}#anchor [NC,NE,R=302,L,END]