У меня есть URL, входящий в apache 2.4:
http: //localhost/index.html? q = asdf & b = a | c | e & c = 4 & d = dsjklkjhd
Мне нужен mod_rewrite для URL-кодирования |
, чтобы я получил:
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]
Я получу следующее в журналах:
access.log
"-" 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
error.log
[Сб, 16 марта, 08:37: 00.723831 2019] [rewrite: trace3] [pid 13] mod_rewrite.c (470): [client 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] применение шаблона '. *' к uri '/index.html'
[Сб, 16 марта, 08: 37: 00.723838 2019] [перезапись: trace4] [pid 13] mod_rewrite.c (470): [клиент 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] RewriteCond: input = 'GET' pattern = '^ TRACE' => not-matched
[Сб, 16 марта, 08: 37: 00.723843 2019] [перезапись: trace4] [pid 13] mod_rewrite.c (470): [клиент 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] RewriteCond: input = 'GET' pattern = '^ OPTIONS' => not-matched
[Сб, 16 марта, 08: 37: 00.723847 2019] [перезапись: trace4] [pid 13] mod_rewrite.c (470): [клиент 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] RewriteCond: input = 'GET' pattern = '^ DELETE' => not-matched
[Сб, 16 марта, 08: 37: 00.723852 2019] [перезапись: trace4] [pid 13] mod_rewrite.c (470): [клиент 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] RewriteCond: input = 'GET' pattern = '^ PUT' => not-matched
[Сб, 16 марта, 08:37: 00.723855 2019] [rewrite: trace3] [pid 13] mod_rewrite.c (470): [client 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] применение шаблона '^ index \ .html $' к uri '/index.html'
[Сб, 16 марта, 08:37: 00.723867 2019] [rewrite: trace3] [pid 13] mod_rewrite.c (470): [client 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] применение шаблона '^ processing /(.+)' к uri '/index.html'
[Сб, 16 марта, 08:37: 00.723874 2019] [rewrite: trace1] [pid 13] mod_rewrite.c (470): [client 172.17.0.1:45194] 172.17.0.1 - - [localhost / sid # 558a781fd350] [rid # 558a782e2e90 / initial] пройти через /index.html
[Сб, 16 марта, 08: 37: 00.724892 2019] [authz_core: debug] [pid 13] mod_authz_core.c (809): [client 172.17.0.1:45194] AH01626: результат авторизации Требовать все предоставлено: предоставлено
[Сб, 16 марта 08: 37: 00.724914 2019] [authz_core: debug] [pid 13] mod_authz_core.c (809): [client 172.17.0.1:45194] AH01626: результат авторизации: предоставлено
Apache перекодирует строку подстановки только в том случае, если она каким-то образом изменяется. Итак, один из способов сделать это (чтобы URL закодировал символ канала |
в запрошенной строке запроса) - это временно переписать запрос (внутренне) на что-то совершенно другое, а затем перенаправить его обратно. URL-адрес перенаправления кодирует полную строку подстановки (избегая цикла перенаправления / перезаписи):
Например ( UPDATED для контекста server / 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 (постоянный) редирект - если это намерение - только после того, как вы подтвердите, что он работает должным образом, чтобы избежать проблем с кешированием.