在PHP中,$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']之间有什么区别?

你会考虑何时使用另一个,为什么?

推荐答案

HTTP_HOST是从HTTP request header中获得的,这是客户端实际用作请求"目标主机"的内容.SERVER_NAME在服务器配置中定义.使用哪一种取决于你需要它做什么.然而,您现在应该意识到,一个是客户端控制的值,因此在业务逻辑中使用可能不可靠,另一个是服务器控制的值,更可靠.但是,您需要确保所讨论的Web服务器正确配置了SERVER_NAME.以Apache HTTPD为例,下面是its documentation的摘录:

如果未指定ServerName,则服务器会try 通过对IP地址执行反向查找来推断主机名.如果ServerName中没有指定端口,那么服务器将使用传入请求的端口.为了获得最佳的可靠性和可预测性,应该使用ServerName指令指定一个显式的主机名和端口.


Update:在判断了包含bobince's answer链接的the answer of Pekka on your question之后,PHP总是会返回HTTP_HOSTSERVER_NAME值,这与我自己的PHP4相反.x+ApacheHTTPD1.2.几年前的x体验,我在Windows XP(Apache HTTPD 2.2.1和PHP5.2.8)上从当前的XAMPP环境中抹go 了一些灰尘,启动了它,创建了一个打印这两个值的PHP页面,创建了一个Java测试应用程序,使用URLConnection修改Host头,测试告诉我这确实是(错误的)情况.

在第一次怀疑PHP并深入研究了大约PHP bug reports个相关主题后,我了解到问题的根源在于所使用的web服务器,即当请求SERVER_NAME时,它错误地返回了HTTP Host头.所以我用various keywords深入研究了Apache HTTPD bug reports,最终找到了related bug.这种行为是在Apache HTTPD 1.3前后引入的.您需要在httpd.conf中的ServerName<VirtualHost>条目中将UseCanonicalName指令设置为on(同时判断the document底部的警告!).

<VirtualHost *>
    ServerName example.com
    UseCanonicalName on
</VirtualHost> 

这对我很管用.

总而言之,SERVER_NAME更可靠,但你在服务器配置上是dependent

Php相关问答推荐

Laravel 11未自动注册策略

如何使用Ubuntu在同一台服务器上为多个版本构建相同的php扩展?

如何在WooCommerce HPOS订单列表中创建自定义过滤器?

提交表格后的重定向不起作用

无法使用DOMPDF在PDF中呈现非ANSI字符

Symfony/Panther Web抓取不适用于登录后的内容(云功能)

如何显示每个分类的当前术语的帖子中包含的前20个标签,不包括标签分类

让所有具有相同名称的产品在WooCommerce中更改价格

WooCommerce数量减号和加号图标未显示

使用PHP编码的字符串与使用OpenSSL编写的shell 代码之间的差异

Select 本地提货时隐藏WooCommerce显示的发货成本

dyld[45923]:未加载库:/usr/local/opt/libavif/lib/libavif.15dylib

在 WooCommerce 中何时何地执行 woocommerce_order_status_completed_notification 挂钩?

对 WooCommerce 购物车和 checkout 中显示的运输方式进行排序

调度程序不发送任何消息

将 WooCommerce 0 销售价格替换为自定义文本,并保留常规价格删除线

如何在构建 PHP 类别数组树的递归函数中将父面包屑传递给子项?

正则表达式请帮我从内容中找到这个词

将 HTML 表单链接到 SQLite 数据库

为什么可以从 PHP 类访问 PHP Trait 的私有成员?