用HTTP_HOST 和 SERVER_NAME获取服务器域名的区别
开发站群软件,用到了根据访问域名判断子站点的相关问题。PHP获取当前域名有两个变量 HTTP_HOST 和 SERVER_NAME,我想知道两者的区别以及哪个更加可靠。下面说说本人经过亲自验证 + 查阅官方文档 + 官方BUG列表 + 官方邮件列表 + sitepoint + webmasterworld + google的总结:
相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范
不同点:
1. 通常情况:
_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。
2. 当服务器为非80端口时:
_SERVER["HTTP_HOST"] 会输出端口号,例如:itokit.com:8080
_SERVER["SERVER_NAME"] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT
3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:
httpd.conf配置如下:
<virtualhost *>
ServerName itokit.com
ServerAlias [url]www.itokit.com[/url]
<\irtualhost>
客户端访问域名[url]www.itokit.com[/url]
_SERVER["HTTP_HOST"] 输出 [url]www.itokit.com[/url]
_SERVER["SERVER_NAME"] 输出 .itokit.com
所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。
[url]http://mimiz.cn/index.php/php/php-http_host-server_name-difference/[/url]
[color=Red]注意:
如果在端口映射的情况下,并且在内网访问,用“$_SERVER['HTTP_X_FORWARDED_HOST']”比较好。 [/color]
关于HTTP_X_FORWARDED_HOST
[b]回复 [url=http://www.zhumeng.org/redirect.php?goto=findpost&pid=319302&ptid=260221]1#[/url] [i]shillan[/i] [/b][color=#000][font=Arial][size=12px]今天在看Xweibo的源码,发现了用$_SERVER['[/size][/font][/color][color=#000][font=Arial][size=12px]HTTP_X_FORWARDED_HOST[/size][/font][/color][color=#000][font=Arial][size=12px]']来判断主机的地址,就目前来说很多人都是直接通过$_SERVER['[/size][/font][/color][color=#000][font=Arial][size=12px]HTTP_HOST[/size][/font][/color][color=#000][font=Arial][size=12px]']来判断的,但是通过代理的话就有问题了,请看下面的问题描述:[/size][/font][/color][indent]
在php中,我们一般通过$_SERVER['HTTP_HOST']来活得URL中网站的域名或者ip地址。[font=Consolas,][list=1][*]php手册中的解释如下: [*]“HTTP_HOST” [*]当前请求的 Host: 头信息的内容。 [/list][/font]
一般来说,这样子不会遇到什么问题,在一些常见的php框架中,如PFC3和FLEA也是基于该预定义变量。
然而最近在做的一个项目,程序移交到客户手里测试时,竟然发现程序的跳转总是会出错。
最后找出原因:$_SERVER['HTTP_HOST']在客户的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。
究其原因,是因为,客户的公司通过一台服务器连接至因特网,而我们的程序所在的服务器,是通过域名映射出来的,也就是中间有个“代理”的过程。因此$_SERVER['HTTP_HOST']在这样的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。[/indent][indent]在PHP手册中评论中也提到了这个:[/indent][indent]
Be careful with HTTP_HOST behind a proxy server. Use these instead.
[HTTP_X_FORWARDED_FOR]
[HTTP_X_FORWARDED_HOST]
[HTTP_X_FORWARDED_SERVER]
In my situation, I used [HTTP_X_FORWARDED_SERVER] in place of [HTTP_HOST] in order get the machine and hostname ([url]www.myurl.com[/url])[/indent][p=26, 2, left]最终解决方案:[/p]
[font=Arial][color=#000000]$host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80' ? '' : ':'.$_SERVER['SERVER_PORT']));[/color][/font]
页:
[1]