Apache mod_rewrite 编码查询字符串参数

Apache mod_rewrite 编码查询字符串参数

我有一个进入 apache 2.4 的 URL:

http://localhost/index.html?q=asdf&b=a|c|e&c=4&d=dsjklkjhd

我需要 mod_rewrite 来对 URLencode 进行处理,|以便获得:

http://localhost/index.html?q=asdf&b=a%7Cc%7Ce&c=4&d=dsjklkjh

我不知道该怎么做,看这里:

https://stackoverflow.com/questions/15938598/rewrite-to-append-to-query-string#15938642

这里

https://httpd.apache.org/docs/current/mod/mod_rewrite.html

我被难住了,试了各种办法。该怎么办?

编辑

如果我尝试这样做:

RewriteCond %{QUERY_STRING} \|
RewriteRule ^index\.html$ /processing/%{QUERY_STRING} [QSD]
RewriteRule ^processing/(.+) /index.html?$1 [R=302,L]

我在日志中看到这个:

访问日志

“-” 172.17.0.1 - - [16/Mar/2019:08:37:00 -0400] “GET /index.html?q=asdf&b=a|c|e&c=4&d=dsjklkjhd HTTP/1.1” 200 520

错误日志

[2019 年 3 月 16 日星期六 08:37:00.723831] [rewrite:trace3] [pid 13] mod_rewrite.c(470): [客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] 将模式'.*'应用于 uri'/index.html'

[2019 年 3 月 16 日星期六 08:37:00.723838] [rewrite:trace4] [pid 13] mod_rewrite.c(470):[客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] RewriteCond:输入='GET' 模式='^TRACE' => 不匹配

[2019 年 3 月 16 日星期六 08:37:00.723843] [rewrite:trace4] [pid 13] mod_rewrite.c(470):[客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] RewriteCond:输入 ='GET' 模式 ='^OPTIONS' => 不匹配

[2019 年 3 月 16 日星期六 08:37:00.723847] [rewrite:trace4] [pid 13] mod_rewrite.c(470):[客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] RewriteCond:输入='GET'模式='^DELETE'=> 不匹配

[2019 年 3 月 16 日星期六 08:37:00.723852] [rewrite:trace4] [pid 13] mod_rewrite.c(470):[客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] RewriteCond:输入='GET'模式='^PUT'=> 不匹配

[2019 年 3 月 16 日星期六 08:37:00.723855] [rewrite:trace3] [pid 13] mod_rewrite.c(470): [客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] 将模式'^index\.html$'应用于 uri'/index.html'

[2019 年 3 月 16 日星期六 08:37:00.723867] [rewrite:trace3] [pid 13] mod_rewrite.c(470): [客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] 将模式'^processing/(.+)'应用于 uri'/index.html'

[2019 年 3 月 16 日星期六 08:37:00.723874] [rewrite:trace1] [pid 13] mod_rewrite.c(470): [客户端 172.17.0.1:45194] 172.17.0.1 - - [localhost/sid#558a781fd350][rid#558a782e2e90/initial] 穿过 /index.html

[2019 年 3 月 16 日星期六 08:37:00.724892] [authz_core:debug] [pid 13] mod_authz_core.c(809): [客户端 172.17.0.1:45194] AH01626:需要全部授予的授权结果:已授予

[2019 年 3 月 16 日星期六 08:37:00.724914] [authz_core:debug] [pid 13] mod_authz_core.c(809):[客户端 172.17.0.1:45194] AH01626:授权结果:已授予

答案1

Apache 似乎只重新编码代换字符串,如果它以某种方式发生变化。因此,执行此操作(对|请求的查询字符串中的管道符号进行 URL 编码)的一种方法是暂时地将请求(内部)重写为完全不同的东西,然后重定向再次返回。重定向 URL 编码完整的代换字符串(避免重定向/重写循环):

例如 (更新对于服务器/vHost 上下文):

RewriteCond %{QUERY_STRING} \|
RewriteRule ^/index\.html$ /processing/%{QUERY_STRING} [QSD]
RewriteRule ^/processing/(.+) /index.html?$1 [R=302,L]

第一条规则在内部重写请求(|查询字符串中包含符号)并将/processing/其作为路径名信息传递QUERY_STRING。查询字符串被丢弃。

下一条规则立即重定向将其返回到所需的 URL,但这次应该重新编码,URL 编码|就像%7c查询字符串中那样。

请注意,这会触发 302(临时)重定向。只有在确认其按预期工作后,才可将其更改为 301(永久)重定向(如果这是意图),以避免缓存问题。

相关内容