Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache mod_重写将锚添加到查询字符串_Apache_.htaccess_Redirect_Mod Rewrite_Url Rewriting - Fatal编程技术网

Apache mod_重写将锚添加到查询字符串

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

我正在尝试使用查询字符串向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_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
    (空白)速记字符类-这是多余的,因为它在这里永远不会匹配。(您的查询字符串值是否真的包含空格?)服务器变量
    query\u string
    是%-编码的,因此不存在文本空格。请求的查询字符串中的任何空格都将被URL编码为
    %20
    +

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

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

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


我在下面添加了一些关于您当前规则的附加说明(背景阅读)。
RewriteCond %{REQUEST_URI} ^/foo$
RewriteCond %{QUERY_STRING}  ^query=[a-zA-Z0-9\s]*$
RewriteRule (.*) /foo?%{QUERY_STRING}#anchor [NC,NE,R=302,L,END]