Нужно разрешить закодированные косые черты на Apache - PullRequest
66 голосов
/ 08 декабря 2010

Я сейчас пытаюсь разместить URL внутри URL.Например:

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

Я знаю, что мне нужно закодировать URL, что я и сделал, но теперь я получаю ошибку 404 с сервера, а не из моего приложения.Я думаю, что моя проблема связана с apache и может быть исправлена ​​с помощью директивы AllowEncodedSlashes On.

Я попытался поместить директиву внизу httpd.conf безрезультатно, и не уверен, что делать дальше,Я помещаю это в правильном месте?Если да, у кого-нибудь есть другие решения?

Ответы [ 7 ]

75 голосов
/ 30 марта 2012

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

У меня был тот же 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 на %252F (например, /example/http:%252F%252Fwww.someurl.com/)

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

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

httpd.conf file:

AllowEncodedSlashes NoDecode

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

Ссылка:

56 голосов
/ 14 декабря 2010

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

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

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

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

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

31 голосов
/ 17 июня 2011

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

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

Этот комментарий предлагает решение, а именно:

AllowEncodedSlashes NoDecode
5 голосов
/ 16 февраля 2012

в свете всех неприятностей, я выбрал 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

2 голосов
/ 11 декабря 2010

После тщательного тестирования и изучения ошибки в 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

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

0 голосов
/ 08 декабря 2015

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

Это двойная кодированная косая черта.

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

0 голосов
/ 10 декабря 2010

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

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

найдено% 2f (закодировано '/') вURI (decoded = '/ url / http://www.url2.com'), возвращает 404

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

Удачи (обоимиз нас)!

...