簡體   English   中英

在PHP中檢測HTTPS請求

[英]Detecting HTTPS requests in PHP

我遇到的問題與需要保留一些受HTTPS保護的網站的網址有關,而其余部分則被踢到HTTP。

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

我的問題是證書位於負載均衡器上 ,並且所有這些變量都不可用,並且網絡服務器在端口80上看到http://www.foo.com 。解決此問題的一種方法是告訴負載均衡器發送流量一個不同的端口,但我想知道是否有其他方法來檢測來自負載均衡器的HTTPS?

如果任何人在Amazon AWS Elastic Load Balancer背后有相同的問題,解決方案很簡單,因為$_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";
}

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM