Apache mod_rewrite закодирует параметры строки запроса

У меня есть 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: результат авторизации: предоставлено

1
задан 16 March 2019 в 14:41
1 ответ

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 (постоянный) редирект - если это намерение - только после того, как вы подтвердите, что он работает должным образом, чтобы избежать проблем с кешированием.

2
ответ дан 3 December 2019 в 20:08

Теги

Похожие вопросы