Передает ли Apache PHP, независимо от того, был ли явно запрошен порт (: 80)?

Неважно, запрашивался ли ресурс через mydomain.com ИЛИ mydomain.com:80 (так делают запросы некоторые боты/пауки): HTTP_HOST всегда отображается как «mydomain.com», и PHP не может узнать, включал ли запрос :80 (2). Это наводит меня на мысль, что Apache передает PHP один и тот же запрос независимо от того, указан порт или нет (и это имеет смысл).

Проблема: на этом компьютере установлен PHP-агент NewRelic, и он сообщает службе NewRelic через используемый файл PHP auto_prepend_file называть приложения отдельно(1), как mydomain.com, так и mydomain.com:80. Эти два одно и то же приложение отображается под двумя разными именами в панели управления NewRelic, что нежелательно. Поскольку имя приложения задается через PHP, как mydomain.com:80 может быть передано в NewRelic API, когда код установка имени даже не может видеть, определяет ли запрос явно :80? Служба поддержки NewRelic сообщает мне, что мой код передает :80 в их API, а это просто невозможно(2). Передает ли Apache PHP независимо от того, был ли явно запрошен порт (:80) или нет?

1) если я не использую этот файл, каждый виртуальный хост на сервере будет сообщать об одном и том же общем имени «приложения PHP».

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


person Gaia    schedule 01.10.2013    source источник


Ответы (2)


HTTP_HOST буквально просто имя хоста, например. www.example.com сайта, к которому вы обращаетесь. Если вам нужен номер порта, на который пришел запрос, то есть $_SERVER['SERVER_PORT']

person Marc B    schedule 01.10.2013
comment
Да, но код, устанавливающий имя приложения, не использует SERVER_PORT. Я перефразировал вопрос, чтобы быть более конкретным. Передает ли Apache PHP, независимо от того, был ли явно запрошен порт (: 80)? - person Gaia; 03.10.2013
comment
да. Для этого предназначен SERVER_PORT - порт, на который пришел обрабатываемый запрос. - person Marc B; 03.10.2013
comment
порт всегда 80, независимо от того, вызывается он явно или нет, так что это не помогает. - person Gaia; 03.10.2013
comment
это нормально, поскольку HTTP по умолчанию использует порт 80. - person Marc B; 03.10.2013
comment
точно. поэтому значение SERVER_PORT совсем не помогает. это всегда одно и то же, независимо от того, было ли :80 явно включено в запрос или нет. Я надеюсь, что это достаточно ясно сейчас. спасибо за помощь. - person Gaia; 03.10.2013

Браузеры И curl удалит :80 из заголовка хоста, если запрошенный порт является стандартным (порт 80). Поскольку я не тестировал с помощью GET, выданного вручную, я не видел, как $_SERVER['HTTP_HOST'] может включать номер порта. Я обнаружил, что это так, КОГДА порт включен в заголовок узла (что имеет смысл, поскольку manual указывает, что $_SERVER['HTTP_HOST'] — это "Содержимое хоста: заголовок текущего запроса, если он есть.")

Раздел 14.23 спецификации HTTP указывает, что порт # должен быть включен в запрос, ЕСЛИ это не порт 80 по умолчанию. Но он не говорит, можно ли включать номер порта, когда используемый порт ЯВЛЯЕТСЯ значением по умолчанию.

В моем случае запросы, которые включают номер порта, даже при использовании порта по умолчанию, поступали из Паук Байду.

Если вам нужно увидеть это самостоятельно, вам нужно выполнить ручной запрос GET. Используйте Netcat или Telnet для отправки этих команд:

$ telnet www.host.com 80
GET /host.php HTTP/1.1
Host: www.host.com:80
Connection: close

(добавьте два CRLF в конце)

person Gaia    schedule 03.10.2013