1. Home
  2. Техническое
  3. Apache
  4. mod_proxy и кодирование URL-символов
  1. Home
  2. Техническое
  3. mod_proxy и кодирование URL-символов

mod_proxy и кодирование URL-символов

Если для приложения, работающего за прокси, важно, чтобы все символы URL поступали в приложение в неизменном виде, то, к сожалению, перенаправление входящих запросов (mod_proxy), настраиваемое через Мой Zone, для этого не подходит, поскольку оно вносит некоторые изменения в URL перед передачей в приложение.
Например, часть символов кодируется в их шестнадцатеричные эквиваленты. Такие изменения претерпевают, например, символы “#“, “&” и “?” (превращаясь соответственно в “%23“, “%26” и “%3F“).

Это, в свою очередь, значительно усложняет использование таких приложений, как, например, Thumbor. Хотя в случае mod_proxy теоретически могло бы помочь ключевое слово nocanon, Мой Zone, к сожалению, не поддерживает эту возможность.

Ситуацию можно решить, заменив mod_proxy на правило Apache Rewrite.
Например, добавив блок директив Apache:

RewriteCond "%{THE_REQUEST}" "^[A-Z]+\ /([^?\ ]+)/?"
RewriteRule "^/(.*)" "http://127.0.157.196:8888/%1" [P,NE]

127.0.157.196 и 8888 необходимо заменить правильными значениями (правильный IP-адрес петли можно найти в панели управления Мой Zone в разделе Веб-хостинг и Данные сервера или, запустив в shell команду vs-loopback-ip -4)

Флаг NE (No Escape) в правиле Rewrite гарантирует, что не происходит никаких изменений в URL и параметрах, передаваемых приложению.
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_ne

Предупреждение о безопасности!

Использование флага [NE] (No Escape) может представлять угрозу безопасности, если запросы перенаправляются на неизвестный или публичный сервис.
Используйте флаг [NE] только при проксировании во внутренний, доверенный сервис и убедитесь, что backend проверяет URL-адреса и не интерпретирует их как команды командной строки или пути к файлам.

Подробное объяснение RewriteCond 

RewriteCond "%{THE_REQUEST}" "^[A-Z]+\ /([^?\ ]+)/?"

Это условие, при котором правило применяется.
Здесь используется специальная переменная %{THE_REQUEST}, которая содержит исходную строку HTTP-запроса браузера, например:
GET /images/foo.jpg?size=large HTTP/1.1

Пояснение к регулярному выражению (regexp)^[A-Z]+\ /([^?\ ]+)/?:

  • ^[A-Z]+ — соответствует HTTP-методу (например GET, POST, HEAD и т.д.)

  • \ / — пробел + косая черта (так всегда начинается URL)

  • ([^?\ ]+) — захватывает все символы до первого знака вопроса ? (параметры запроса) или пробела.
    То есть: захватывается только «чистый путь» URL без query string.

  • /? — допускает один необязательный слэш(косая черта) в конце.

Эта «захваченная» часть сохраняется как группа %1, которую можно использовать позже внутри RewriteRule.

Updated on 6. Nov 2025
Was this article helpful?

Related Articles