1

mydomain.com是否通过OR请求资源并不重要mydomain.com:80(这是一些机器人/蜘蛛发出请求HTTP_HOST的方式):始终显示为“mydomain.com”,PHP 无法知道请求是否包含:80 (2) . 这让我相信,无论是否指定了端口,Apache 都会将完全相同的请求传递给 PHP(这是有道理的)。

问题:我在这台机器上安装了 NewRelic PHP 代理,它通过PHP auto_prepend_file 向 NewRelic 服务报告,该文件用于分别命名应用程序(1)mydomain.commydomain.com:80. 这两个是同一个应用程序,在 NewRelic 控制面板中以两个不同的名称显示,这是不可取的。mydomain.com:80由于应用程序名称是通过 PHP设置的,当设置名称的代码甚至无法查看请求是否明确定义 :80 时,怎么可能将其传递给 NewRelic API?NewRelic 支持告诉我,我的代码正在将 :80 传递给他们的 API,这是不可能的 (2)。无论端口(:80)是否被明确请求,Apache 是否都会传递给 PHP?

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

4

2 回答 2

1

HTTP_HOST实际上只是www.example.com您正在访问的站点的主机名,例如 。如果你想要请求进入的端口号,那么有$_SERVER['SERVER_PORT']

于 2013-10-01T18:52:04.333 回答
1

当请求的端口是标准端口(端口 80)时,浏览器和 curl 将从主机标头中删除 :80。由于我没有使用手动发出的 GET 进行测试,我没有看到 $_SERVER['HTTP_HOST'] 怎么可能包含端口号。我发现确实如此,当端口包含在主机标头中时(这是有道理的,因为手册指定 $_SERVER['HTTP_HOST'] 是“当前请求的主机内容:标头,如果有的话。 ")

HTTP 规范的第 14.23 节规定,如果端口号不是默认端口 80,则应将端口号包含在请求中。但是当使用的端口为默认端口时,它并没有说明是否可以包含端口号。

在我的例子中,包含端口号的请求,即使使用默认端口,也来自百度蜘蛛

如果您需要自己查看此内容,则需要发出手动 GET 请求。使用 Netcat 或 Telnet 发送这些命令:

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

(最后添加两个 CRLF)

于 2013-10-03T21:36:36.897 回答