zoukankan      html  css  js  c++  java
  • 关于$_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']));

  • 相关阅读:
    计算机系统概述
    Qt学习--初学注意事项
    Qt实现一个简单的TextEditor
    Qt 用户登录界面
    C++ 模板
    多态与虚函数
    继承与派生
    C++ 运算符重载
    web安全-点击劫持
    web安全问题-cookie
  • 原文地址:https://www.cnblogs.com/jiechn/p/3993127.html
Copyright © 2011-2022 走看看