Мне нужна помощь в отношении требования. У нас установлен Apache 2.4.6
У меня есть URL-адрес с закодированной строкой запроса:
https://example.com/home?testStr%3Dhello%26id%3Drad
Я пытаюсь выяснить, как дважды закодировать только часть строки запроса URL-адреса, используя mod_rewrite на веб-сервере Apache, чтобы:
https://example.com/home?testStr%253Dhello%2526id%253Drad
Это одна из проблем, которые я пытаюсь исправить.
Просто чтобы выразить озабоченность в комментариях ... это странное требование. Однако вы можете сделать это с помощью mod_rewrite. Например, попробуйте следующее:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(testStr%3Dhello%26id%3Drad)$
RewriteRule ^/?(home)$ /$1?%1 [B,NE,R,L]
Это вызывает временное (302) перенаправление с /home?testStr%3Dhello%26id%3Drad
к /home?testStr%253Dhello%2526id%253Drad
(двойное кодирование).
В QUERY_STRING
переменная сервера не декодируется%, поэтому вы сопоставляете буквальную строку запроса, как указано в RewriteCond
директива.
В $1
обратная ссылка относится к захваченному подшаблону в RewriteRule
шаблон т.е. home
.
В %1
обратная ссылка относится к захваченному подшаблону в последнем сопоставленном CondPattern (в RewriteCond
директива) т.е. закодированная в% строка запроса (testStr%3Dhello%26id%3Drad
).
В B
(escape backreferences) флаг на RewriteRule
директива% - кодирует обратную ссылку (%1
) для эффективного двойного кодирования строки запроса.
В NE
(noescape) флаг предотвращает учреждение дополнительно (тройное) URL-кодирование!