Необходимо разрешить кодированные косые черты на Apache

В настоящее время я пытаюсь поместить URL-адрес в URL-адрес. Например:

http://example.com/url/http%3A%2F%2Fwww.url2.com

Я знаю, что мне нужно кодировать URL-адрес, который я сделал, но теперь я получаю 404 ошибка с сервера, а не мое приложение. Я думаю, что моя проблема связана с Apache и может быть исправлена с

7 ответов


эта проблема не связана с ошибкой Apache 35256. Скорее, это связано с ошибкой 46830. The AllowEncodedSlashes настройка не наследуется виртуальными хостами, и виртуальные хосты используются во многих конфигурациях Apache по умолчанию, таких как в Ubuntu. Обходным путем является добавление AllowEncodedSlashes настройки внутри <VirtualHost> контейнера (/etc/apache2/sites-available/default в Ubuntu).

35256 ошибка: %2F будет декодирован в PATH_INFO (документация на AllowEncodedSlashes говорит, что декодирование не будет готово)

46830 ошибка: если AllowEncodedSlashes On устанавливается в глобальном контексте, не наследуется виртуальными хостами. Вы должны явно установить AllowEncodedSlashes On в каждом <VirtalHost> контейнер.

в документации о том, как объединяются различные разделы конфигурации, говорится:

разделы внутри <VirtualHost> разделы применяются после соответствующих разделов вне определения виртуального хоста. Это позволяет виртуальным хостам переопределять основной сервер конфигурация.


я продолжал натыкаться на этот пост для другого вопроса. Позвольте мне объяснить по-быстрому.

у меня был тот же URL стиля, и я также пытался прокси-сервер.

пример: Прокси-запросы из /example/ на другой сервер.

/example/http:%2F%2Fwww.someurl.com/

Вопрос 1: Apache считает, что это недопустимый url

устранение: AllowEncodedSlashes On в httpd.conf

Вопрос 2: Apache декодирует кодировку слеши

устранение: AllowEncodedSlashes NoDecode в httpd.conf (требуется Apache 2.3.12+)

Вопрос 3: mod_proxy пытается перекодировать (двойное кодирование) изменение URL %2F to %252F (напр. /example/http:%252F%252Fwww.someurl.com/)

Решение:httpd.conf использовать ProxyPass ключевое слово nocanon для передачи необработанного URL-адреса через прокси-сервер.

ProxyPass http://anotherserver:8080/example/ nocanon

httpd.conf файл:

AllowEncodedSlashes NoDecode

<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>

ссылки:


Я потратил очень много часов на эту проблему. Я немного опоздала на вечеринку, но, кажется, теперь есть решение.

по состоянию на этой теме, есть (была) ошибка в Apache такая, что если у вас есть AllowEncodedSlashes On, это предотвращает 404, но это ошибочно декодирует косые черты, которые неверны в соответствии с RFC.

комментарий предлагает решение, а именно использовать:

AllowEncodedSlashes NoDecode

в свете всех неприятностей, я выбрал base64_encoding с последующим urlencoding. Он работает без необходимости дурачиться с настройками сервера apache или просматривать отчеты об ошибках. Он также работает без необходимости помещать url-адрес в раздел запроса.

$enc_url = urlencode(base64_encode($uri_string));

и вернуть его

$url = base64_decode(urldecode($enc_url));

http://example.com/admin/supplier_show/8/YWRtaW4vc3VwcGxpZXJz

http://example.com/admin/supplier_show/93/YWRtaW4vc3VwcGxpZXJzLzEwMA%3D%3D


после справедливого тестирования и глядя на ошибку в Apache, я пришел к выводу, что, несмотря на предлагаемые решения на разных форумах, это нерешенная проблема в Apache. Смотрите ошибку:https://issues.apache.org/bugzilla/show_bug.cgi?id=35256

обходной путь, который работает для меня, - это рефакторинг URI так, чтобы элемент, который может содержать экранированные косые черты, находился в разделе запроса URI вместо пути. Мои тесты показывают, что когда они там, они не отфильтровывайте Apache, независимо от настроек AllowEncodedSlashes и AcceptPathInfo.

Так: http://test.com/url?http%3A%2F%2Fwww.url2.com

или: http://test.com/url?theURL=http%3A%2F%2Fwww.url2.com

вместо: http://test.com/url/http%3A%2F%2Fwww.url2.com

Это означает изменение архитектуры для нашего проекта, но это кажется неизбежным. Надеюсь, вы нашли решение.


Я получаю ту же проблему с "AllowEncodedSlashes On" и попытался разместить директиву в нескольких разных местах: apache2.conf, httpd.conf, и внутри раздела, согласно примеру на http://www.jampmark.com/web-scripting/5-solutions-to-url-encoded-slashes-problem-in-apache.html.

Если вы еще этого не сделали, вы можете установить уровень ведения журнала для отладки (другая директива) и посмотреть, получите ли вы ошибку:

нашли %2Ф (закодировано '/') в URI (декодировано='/url/http://www.url2.com'), возвращаясь 404

другие не найденные ошибки не предоставляют эту информацию в журналах. Просто еще одна диагностика...

удачи (нам обоим)!


заменить %2F с %252F на стороне клиента.

это двойная закодированная форма косой черты.

поэтому, когда он достигнет сервера и будет преждевременно декодирован, он декодирует его в %2F, что именно то, что вы хотите.