Назад | Перейти на главную страницу

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 / мар / 2019: 08: 37: 00 -0400] "GET /index.html?q=asdf&b=a|c|e&c=4&d=dsjklkjhd HTTP / 1.1" 200 520

журнал ошибок

[Сб, 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] [rewrite: trace4] [pid 13] mod_rewrite.c (470): [client 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] [rewrite: trace4] [pid 13] mod_rewrite.c (470): [client 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] [rewrite: trace4] [pid 13] mod_rewrite.c (470): [client 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] [rewrite: trace4] [pid 13] mod_rewrite.c (470): [client 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-адрес перенаправления кодирует полный замена строка (избегая цикла перенаправления / перезаписи):

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