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