有什么区别$_SERVER['HTTP_HOST']
and $_SERVER['SERVER_NAME']
in PHP?
您什么时候会考虑使用其中一种而不是另一种?为什么?
The HTTP_HOST
是从获得HTTP 请求头 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23这就是客户端实际用作请求的“目标主机”的主机。这SERVER_NAME
在服务器配置中定义。使用哪一种取决于您需要它的用途。然而,您现在应该意识到,一个是客户端控制的值,因此在业务逻辑中使用可能不可靠,而另一个是更可靠的服务器控制的值。但是,您需要确保相关网络服务器具有SERVER_NAME
正确配置。以 Apache HTTPD 为例,以下是摘录它的文档 http://httpd.apache.org/docs/2.2/mod/core.html#servername:
If no ServerName
指定后,服务器会尝试通过对 IP 地址执行反向查找来推断主机名。如果没有指定端口ServerName
,那么服务器将使用传入请求中的端口。为了获得最佳的可靠性和可预测性,您应该使用以下命令指定显式的主机名和端口:ServerName
指示。
Update: 检查后佩卡对你问题的回答 https://stackoverflow.com/a/2297446其中包含一个链接鲍宾斯的回答 https://stackoverflow.com/a/1461430PHP 总是会返回HTTP_HOST
的价值为SERVER_NAME
,这与我几年前的 PHP 4.x + Apache HTTPD 1.2.x 经验相悖,我从 Windows XP 上当前的 XAMPP 环境(Apache HTTPD 2.2.1 和 PHP 5.2.8)中吹掉了一些灰尘,开始它创建了一个打印这两个值的 PHP 页面,使用创建了一个 Java 测试应用程序URLConnection http://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html修改Host
标头和测试告诉我,情况确实如此(错误地)。
在第一次怀疑 PHP 并深入研究一些内容之后PHP 错误报告 http://www.google.com/search?q=server_name+http_host+site%3Abugs.php.net关于这个主题,我了解到问题的根源在于使用的 Web 服务器,它错误地返回了 HTTPHost
标题时SERVER_NAME
被要求。所以我深入研究Apache HTTPD 错误报告 http://www.google.com/search?q=server_name+http_host+site%3Abz.apache.org+httpd using 各种关键词 http://www.google.com/search?q=php+servername+site%3Abz.apache.org+httpd关于这个主题,我终于找到了相关错误 https://bz.apache.org/bugzilla/show_bug.cgi?id=44614。此行为是从 Apache HTTPD 1.3 左右开始引入的。你需要设置UseCanonicalName http://httpd.apache.org/docs/2.2/mod/core.html#usecanonicalname指示on
in the <VirtualHost>
的条目ServerName
in httpd.conf
(另请检查底部的警告该文件 http://httpd.apache.org/docs/2.2/mod/core.html#usecanonicalname!).
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
这对我有用。
总结一下,SERVER_NAME
更可靠,但你依赖的在服务器配置上!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)