Как настроить Apache / PHP для принятия косой черты в строках запроса?

У меня есть два сервера Apache, на которых работает PHP. В строке запроса принимается прямая слэши и, как ожидается, передает ее в PHP, например:

 HTTP: //server/index.php URL = HTTP: //foo.bar

работает и в PHP это выражение верно:

$_REQUEST['url'] == "http://foo.bar" 

Однако на другом сервере Apache тот же URL-адрес приводит к ошибке 403 Forbidden ! Обратите внимание, что если строка запроса правильно экранирована URL (т. %2F С %2F вместо forward-slash), тогда все работает.

Очевидно, что есть какая-то разница в конфигурации Apache или PHP, которая вызывает это, но я не могу понять, что!

Я хочу принять эту форму URL в обоих случаях, а не отклонять ее.

http://server/index.php?url=http://foo.bar не является допустимым URL-адресом. Вы должны кодировать косые черты. Я думаю, что браузеры делают это автоматически, так что, возможно, вы тестировали разные браузеры?

Или, возможно, это параметр AllowEncodedSlashes ?

Несколько сообщений показывают, что использование ОП неверно, что неверно.

Расширяясь в комментарии Sam152, строки запроса могут содержать оба? и / персонажи, см. раздел 3.4 http://www.ietf.org/rfc/rfc3986.txt , который в основном является спецификацией Тима Бернерса-Ли и друзей, определяющих, как должна работать сеть.

Проблема состоит в том, что плохо написанные (или плохо сконфигурированные или неправильно используемые) синтаксические анализаторы интерпретируют строковые косы строки запроса как разделительные компоненты пути.

Я видел примеры функции pathinfo PHP, используемой для анализа URL-адресов. Pathinfo не был написан для анализа URL-адреса. Однако вы можете извлечь путь, используя parse_url, а затем использовать fileinfo для извлечения деталей из пути. Вы увидите, что parse_url обрабатывает / и? в строках запроса просто отлично.

В любом случае общая проблема заключается в том, что эта область плохо понимается повсеместно, даже среди опытных разработчиков, и большинство людей (включая меня до недавнего времени) просто предполагали, что что-либо после того, как имя файла должно быть уркокодировано, что явно ошибочно, если вы учитывать стандарты.

tl; dr Прочитайте спецификацию 🙂

У вас установлен mod_security ? Смотрите эту тему:

403 Запрещено на странице PHP с URL, закодированным в параметре $ _GET

В вашей конфигурации Apache:

 AllowEncodedSlashes On 

Дополнительную информацию см. В документации:
http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

Edit: Хм, это может быть то, что у вас уже есть … У меня была такая же проблема, и для меня это было исправлено для того, чтобы просто использовать $_SERVER['REQUEST_URI'] поскольку у меня были данные, которые мне нужны.

Вы не укажете, что делает PHP с этим URL-адресом. Переадресовывает ли она эту страницу или пытается ее прочитать?

Возможно, существует некоторое правило mod_rewrite для удаления двойных косых черт или для какой-либо другой цели, которая пытается перенаправить это где-то, где это не должно.

Может быть, регулярное выражение без ^ до http: //

Обратите внимание, что если строка запроса правильно экранирована URL (т. Е. С% 2F вместо forward-slash), тогда все работает.

Таким образом, он работает, когда строка запроса правильно отформатирована и не работает, когда это не так. В чем проблема?

Это похоже на другой случай по умолчанию magic_quotes_gpc. На сервере, вызывающем проблемы, проверьте php.ini и убедитесь, что

 magic_quotes_gpc = Off