我有一个进入 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(永久)重定向(如果这是意图),以避免缓存问题。