關於HTTP_X_FORWARDED_HOST

目前來講不少人都是直接經過$_SERVER['HTTP_HOST']來判斷的,可是經過代理的話就有問題了,請看下面的問題描述:php

在php中,咱們通常經過$_SERVER['HTTP_HOST']來活得URL中網站的域名或者ip地址。php框架

  1. php手冊中的解釋以下:  
  2. 「HTTP_HOST」  
  3. 當前請求的 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.
[HTTP_X_FORWARDED_FOR]
[HTTP_X_FORWARDED_HOST]
[HTTP_X_FORWARDED_SERVER]
url

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']));
相關文章
相關標籤/搜索