我使用nginx作為負載平衡器,后面是Apache應用服務器。由于SSL連接在負載平衡器處終止,因此$ b b $ b $ _ SERVER ['HTTPS'] $ b
找到一個安全的方式來檢測應用服務器上的HTTPS。
到目前為止,我把它放到我的CakePHP配置中:
$ request_headers = getallheaders();
if((isset($ _ SERVER ['HTTPS'])&& $ _SERVER ['HTTPS'])||(isset($ request_headers ['X-Forwarded-Proto'])&& $ request_headers ['X-Forwarded-Proto'] =='https')){$ ssl = true;
//覆蓋環境vars(ugly),因為CakePHP不會支持X-Forwarded-Proto$ _SERVER ['HTTPS'] ='on';
$ _ENV ['HTTPS'] ='on';
} else {
$ ssl = false;
}
然后在nginx配置中,我使用了 proxy_set_header X-Forwarded-Proto https; 將標記添加到負載均衡器和后端應用程序服務器之間的任何請求。
這完全正常,但任何人直接請求應用程序服務器可能會欺騙他們認為他們正在瀏覽SSL,當他們不是。我不知道這是否是一個安全風險,但它似乎不是一個好主意。
這是一個安全風險嗎?
因為使用 X-Forwarded-Proto 看起來像標準的標準,解決方案可能是一個很好的補丁提交給CakePHP核心,所以我認為任何答案都可以合法地涉及編輯核心文件。

解決方案:
mod_rpaf 會讓你這樣做。
這會設定Apache的HTTPS值到“on”基于nginx發送的頭,所以Cake將開箱即用(以及Apache中運行的任何其他應用程序)。
它還會更正REMOTE_ADDR,SERVER_PORT和HTTP_HOST的值。
這是我的示例config:
< IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_ProxyIPs 127.0.0.1 10.0.0.0/24
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
< / IfModule>
?。H绻鹠od_rewrite重定向,那么我們失去HTTPS狀態為REDIRECT_HTTPS。
#這將重置它。這發生在Cake的前臺控制器
< IfModule setenvif_module>
SetEnvIf REDIRECT_HTTPS on HTTPS = on
< / IfModule>