Необходимо разрешить кодированные косые черты на 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, что именно то, что вы хотите.