Как настроить Apache / PHP для приема слешей в строках запросов? - PullRequest
5 голосов
/ 20 января 2009

У меня есть два сервера Apache, работающие на PHP. Каждый принимает прямую косую черту в строке запроса и передает ее в PHP ожидаемым образом, например:

http://server/index.php?url=http://foo.bar

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

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

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

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

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

Ответы [ 7 ]

7 голосов
/ 29 ноября 2011

Несколько постов здесь предполагают неправильное использование ОП, что неверно.

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

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

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

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

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

1 голос
/ 06 января 2010
1 голос
/ 20 января 2009

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

AllowEncodedSlashes On

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

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

1 голос
/ 20 января 2009

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

Или, может быть, это настройка AllowEncodedSlashes ?

0 голосов
/ 20 января 2009

Обратите внимание, что если строка запроса правильно экранирована URL (т.е. с% 2F вместо прямой косой черты), то все работает.

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

0 голосов
/ 20 января 2009

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

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

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

0 голосов
/ 20 января 2009

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

magic_quotes_gpc = Off
...