目前来讲不少人都是直接经过$_SERVER['HTTP_HOST']来判断的,可是经过代理的话就有问题了,请看下面的问题描述:php
在php中,咱们通常经过$_SERVER['HTTP_HOST']来活得URL中网站的域名或者ip地址。php框架
- php手册中的解释以下:
- “HTTP_HOST”
- 当前请求的 Host: 头信息的内容。
通常来讲,这样子不会遇到什么问题,在一些常见的php框架中,如PFC3和FLEA也是基于该预约义变量。服务器
然而最近在作的一个项目,程序移交到客户手里测试时,居然发现程序的跳转老是会出错。框架
最后找出缘由:$_SERVER['HTTP_HOST']在客户的环境里,取得的值老是程序所在的服务器在其局域网内的ip值。测试
究其缘由,是由于,客户的公司经过一台服务器链接至因特网,而咱们的程序所在的服务器,是经过域名映射出来的,也就是中间有个“代理”的过程。所以$_SERVER['HTTP_HOST']在这样的环境里,取得的值老是程序所在的服务器在其局域网内的ip值。网站
在PHP手册中评论中也提到了这个:
Be careful with HTTP_HOST behind a proxy server. Use these instead.
url
[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 (www.myurl.com)代理
最终解决方案:code
$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']));