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

apache 2.4 - двойное кодирование уже закодированной строки запроса в URL

Мне нужна помощь в отношении требования. У нас установлен 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 обратная ссылка относится к захваченному подшаблону в последнем сопоставленном CondPatternRewriteCond директива) т.е. закодированная в% строка запроса (testStr%3Dhello%26id%3Drad).

В B (escape backreferences) флаг на RewriteRule директива% - кодирует обратную ссылку (%1) для эффективного двойного кодирования строки запроса.

В NE (noescape) флаг предотвращает учреждение дополнительно (тройное) URL-кодирование!