关于$_SERVER 常量 HTTP_X_FORWARDED_HOST与 HTTP_HOST的问题

今天在看ecshop的源码,发现了用$_SERVER[‘HTTP_X_FORWARDED_HOST‘]来判断主机的地址,就目前来说很多人都是直接通过$_SERVER[‘HTTP_HOST‘]来判断的,但是通过代理的话就有问题了,请看下面的问题描述:

在php中,我们一般通过$_SERVER[‘HTTP_HOST‘]来活得URL中网站的域名或者ip地址。

  1. php手册中的解释如下:
  2. “HTTP_HOST”
  3. 当前请求的 Host: 头信息的内容。

一般来说,这样子不会遇到什么问题,在一些常见的php框架中,如PFC3和FLEA也是基于该预定义变量。

然而最近在做的一个项目,程序移交到客户手里测试时,竟然发现程序的跳转总是会出错。

最后找出原因:$_SERVER[‘HTTP_HOST‘]在客户的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。

究其原因,是因为,客户的公司通过一台服务器连接至因特网,而我们的程序所在的服务器,是通过域名映射出来的,也就是中间有个“代理”的过程。因此$_SERVER[‘HTTP_HOST‘]在这样的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。

来源:http://stephenjqj.iteye.com/blog/429879

在PHP手册中评论中也提到了这个:

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

来源:http://www.php.net/manual/zh/reserved.variables.php#65190

http://pinds.com/2005/12/05/what-s-with-http_x_forwarded_host/中也关于HTTP_X_FORWARDED_HOST的讨论

最终解决方案:

$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‘]));

时间: 2024-11-15 00:54:49

关于$_SERVER 常量 HTTP_X_FORWARDED_HOST与 HTTP_HOST的问题的相关文章

PHP中$_SERVER常量的详细分析

["HTTP_HOST"] => string(9) "127.0.0.1" ["SERVER_NAME"] => string(9) "127.0.0.1" PHP的SERVER保留变量中HTTP_HOST 和 SERVER_NAME经常是一样的,原因是服务器端口是80,那么HTTP_HOST将省略不显示,而HTTP服务的默认端口就是80,所以大多数情况下,HTTP_HOST都没有显示这个端口号.而如果使用的是s

[PHP学习教程 - 网络]002.$_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]介绍($_SERVER URL Infomation)

引言:在使用原生PHP的时候,对于URL路径的切割,如:域名,查询参数等等的提取,通常绝大多数兄弟会忽略$_SERVER中定义的内置常量的关系,这里为大家讲解一下. 常用的URL请求路径$_SERVER常量包含以下四个API! $_SERVER["SCRIPT_NAME"]  获取当前脚本的路径,如:index.php $_SERVER["PHP_SELF"]  当前正在执行脚本的文件名 $_SERVER["QUERY_STRING"]  获取查

微信分享jssdk config:invalid signature 签名错误

使用微信分享时,按照官方给的demo,使用时一直提示签名错误. 根据微信开发文档(http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html)排查,完全没问题,而且可以通过他们的检验工具检验(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign). 输出签名与PHP程序计算出来的签名是一致的,莫名其妙的问题. 最后经过网友提醒,是微信demo程序获取URL中

IIS-反向代理

测试环境:Windows10.IIS/10.0 1.安装ARR.URL Rewrite(URL重写工具2.0) 注意英文和中文环境的对应: Application Request Routing 对应中文 应用程序请求路由 URL Rewrite Module 对应中文 URL重写 下载安装ARR(也可以在IIS管理器中,Web平台安装程序->产品->搜索框中搜索"arr"->应用程序请求路由3.0 Beta->添加->安装): http://www.ii

php全面获取url地址栏及各种参数

php教程 全面获取url地址栏参数多种方法: $_SERVER["SERVER_PORT"]//获取端口 $_SERVER['HTTP_HOST']//获取域名或主机地址$_SERVER['SERVER_NAME']//获取域名或主机地php://input是什么意思?php输入流input的介绍址 注:只是主域名 如xhxu.cn $_SERVER["REQUEST_URI"]//获取域名后的详细地址 如:/index.php?id=123 ...$_SERVE

速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 获取 http 请求数据 获取 get 数据 和 post 数据 json 字符串与对象之间的相互转换 示例1.获取 http 请求数据http/http1.php <?php /** * 获取 http 请求数据 */ // 通过 $_SERVER 获取相关数据 echo "PHP_SELF : " . $_SERVER['PHP_SELF'] . "<br />"; echo &qu

Django框架 之 view视图

浏览目录 概述 简单的视图 HttpRequest对象 CBV和FBV 给视图加装饰器 Request对象 Response对象 JsonResponse对象 Django shortcut functions 一.概述 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项

python(十五):Django之HttpRequest

当一个请求连接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的视图函数.每个请求的视图函数都会返回一个HttpResponse. HttpRequest和HttpResponse可以从django.http中导入. 1.HttpRequest类  函数  功能描述 HttpRequest.scheme 请求协议(http或者https) HttpRequest.body 以字节的方式返回请求体内容:可以通过HttpRequest

php第一日

php 服务器端的语言html css js 浏览器识别客户端语言php:保护表单提交 交互 执行官 服务器环境wamp: windows + apahce + mysql + phplamp: linux + apahce + mysql + phplnmp: linux + ngigx + mysql + php 集成安装 phpstudy wampserver xampp 命令安装:一键安装: 需求:分析:apache: mysql:访问 localhost/127.0.0.1Listen