2009-01-16 57 views
17

我遇到的問題是需要保留HTTPS保護的某個網站的某些網址,其餘的網址都是HTTP。在PHP中檢測HTTPS請求

通常,你有$_SERVER['HTTP_HTTPS']$_SERVER['HTTPS'](取決於你的Apache的味道)。您還可以檢查端口 - 正常流量爲80,HTTPS爲443。

我的問題是,證書坐在負載平衡器,而所有這些變量是不可用的,和web服務器看到http://www.foo.com端口80上的一個方法來解決這個是告訴負載均衡器上發送不同的交通端口,但我想知道是否有其他方法來檢測來自負載均衡器的HTTPS?

回答

14

如果負載均衡器是SSL連接的另一端,您將無法獲得比負載均衡器明確提供的信息更多的信息。我會去添加一個http頭,它可能已經這樣做了,轉儲所有的HTTP頭並查找。

作爲另一種解決方案,您可以根據URL在負載均衡器上執行重定向。

+0

是的,很好的答案hayalci。我剛剛查看了同樣的問題(在一個我認爲也是負載平衡的站點上),並且似乎唯一可以識別HTTPS使用的方法是通過頭文件'HTTP_NOSSL`。 True表示HTTP,false表示HTTPS。 – 2011-08-17 02:54:24

38

如果有人有一個亞馬遜AWS彈性負載均衡背後的同樣的問題,解決方法很簡單,因爲$_SERVER變量將包括:

[HTTP_X_FORWARDED_PORT] => 443 
[HTTP_X_FORWARDED_PROTO] => https 

因此,要獲得該協議,您可以使用:

function getRequestProtocol() { 
    if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) 
     return $_SERVER['HTTP_X_FORWARDED_PROTO']; 
    else 
     return !empty($_SERVER['HTTPS']) ? "https" : "http"; 
} 
+2

是否曾有過$ _SERVER ['HTTP_X_FORWARDED_PROTO']`不會包含在$ _SERVER var中的情況? – eipark 2012-07-29 09:13:45

2

$ _SERVER ['HTTP_X_FORWARDED_PROTO']似乎是joomla用戶的一個很好的解決方案,因爲如果您的loadbalancer執行重定向並且將force_ssl設置爲1或2,那麼您將以無限循環結束,因爲joomla總是會看到http: