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

StackOverflow https://stackoverflow.com/questions/462082

Вопрос

У меня есть два сервера 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 в обоих случаях, а не отклонять ее.

Это было полезно?

Решение

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

Или, может быть, это параметр AllowEncodedSlashes ?

Другие советы

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

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

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

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

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

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

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

AllowEncodedSlashes On

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

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

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

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

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

  

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

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

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

magic_quotes_gpc = Off
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top