Как настроить Apache / PHP для приема слешей в строках запросов?
-
19-08-2019 - |
Вопрос
У меня есть два сервера 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 Прочитайте спецификацию:)
У вас есть mod_security
установлено? Смотрите эту тему:
403 Запрещено на странице PHP, вызываемой по URL, закодированному в параметре $ _GET
В вашей конфигурации 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