Проходит ли Apache на PHP, явно ли был запрошен порт (:80)?
Неважно, был ли ресурс запрошен через mydomain.com
ИЛИ ЖЕ mydomain.com:80
(это то, как некоторые боты / пауки делают запросы): HTTP_HOST
всегда отображается как "mydomain.com", и у PHP нет возможности узнать, содержал ли запрос a:80 (2). Это наводит меня на мысль, что Apache передает точно такой же запрос PHP независимо от того, указан порт или нет (это имеет смысл).
Проблема: у меня на этом компьютере установлен PHP-агент NewRelic, и он отчитывается перед службой NewRelic через файл auto_prepend_file, используемый для именования приложений по отдельности(1), оба mydomain.com
а также mydomain.com:80
, Эти два приложения отображаются под двумя разными именами в панели управления NewRelic, что нежелательно. Так как имя приложения устанавливается через PHP, как мог mydomain.com:80
возможно, будет передано в API NewRelic, когда код, устанавливающий имя, даже не может увидеть, явно ли запрос определяет:80? Поддержка NewRelic говорит мне, что мой код передает: 80 к их API, и это просто невозможно (2). Apache передает PHP, был ли порт (:80) явно запрошен или нет?
1) если я не использую этот файл, каждый vhost на сервере будет сообщать под тем же общим именем "PHP Application"
2) SERVER_PORT всегда будет равен 80, независимо от того, вызывается он явно или нет (если, конечно, это не запрос https или нестандартный порт, который здесь не обсуждается). Другими словами, я не могу использовать SERVER_PORT для фильтрации запросов, для которых явно задан порт, потому что независимо от того, имеет ли запрос явно определенный порт, он невидим для PHP.
Apache 2.2.15, mod_fcgid 2.3.7, PHP 5.3.3, Linux 2.6.32.60-40 x64, CentOS 6.4
2 ответа
Браузеры И curl удаляют:80 из заголовка хоста, когда запрашиваемый порт является стандартным (порт 80). Поскольку я не тестировал с использованием GET, выпущенного вручную, я не видел, как $_SERVER['HTTP_HOST'] может включать номер порта. Я обнаружил, что это так, когда порт включен в заголовок хоста (что имеет смысл, поскольку в руководстве указано, что $_SERVER['HTTP_HOST'] равно "Содержимое заголовка Host: из текущего запроса, если он есть).")
Раздел 14.23 спецификации HTTP гласит, что порт # должен быть включен в запрос, ЕСЛИ это не порт по умолчанию, равный 80. Но он не говорит, все ли в порядке или нет, включать номер порта, если порт используется по умолчанию.
В моем случае запросы, содержащие номер порта, даже при использовании порта по умолчанию, поступили от Baidu Spider.
Если вам нужно увидеть это самостоятельно, вам нужно отправить запрос GET вручную. Используйте Netcat или Telnet для отправки этих команд:
$ telnet www.host.com 80
GET /host.php HTTP/1.1
Host: www.host.com:80
Connection: close
(добавить два CRLF в конце)
HTTP_HOST
буквально просто имя хоста, например www.example.com
сайта, на который вы заходите. Если вы хотите номер порта, на который пришел запрос, то есть $_SERVER['SERVER_PORT']