我使用nginx作為負(fù)載平衡器,后面是Apache應(yīng)用服務(wù)器。由于SSL連接在負(fù)載平衡器處終止,因此$ b b $ b $ _ SERVER ['HTTPS'] $ b
找到一個(gè)安全的方式來檢測(cè)應(yīng)用服務(wù)器上的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;
//覆蓋環(huán)境vars(ugly),因?yàn)镃akePHP不會(huì)支持X-Forwarded-Proto$ _SERVER ['HTTPS'] ='on';
$ _ENV ['HTTPS'] ='on';
} else {
$ ssl = false;
}
然后在nginx配置中,我使用了 proxy_set_header X-Forwarded-Proto https; 將標(biāo)記添加到負(fù)載均衡器和后端應(yīng)用程序服務(wù)器之間的任何請(qǐng)求。
這完全正常,但任何人直接請(qǐng)求應(yīng)用程序服務(wù)器可能會(huì)欺騙他們認(rèn)為他們正在瀏覽SSL,當(dāng)他們不是。我不知道這是否是一個(gè)安全風(fēng)險(xiǎn),但它似乎不是一個(gè)好主意。
這是一個(gè)安全風(fēng)險(xiǎn)嗎?
因?yàn)槭褂?X-Forwarded-Proto 看起來像標(biāo)準(zhǔn)的標(biāo)準(zhǔn),解決方案可能是一個(gè)很好的補(bǔ)丁提交給CakePHP核心,所以我認(rèn)為任何答案都可以合法地涉及編輯核心文件。

解決方案:
mod_rpaf 會(huì)讓你這樣做。
這會(huì)設(shè)定Apache的HTTPS值到“on”基于nginx發(fā)送的頭,所以Cake將開箱即用(以及Apache中運(yùn)行的任何其他應(yīng)用程序)。
它還會(huì)更正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>
#如果mod_rewrite重定向,那么我們失去HTTPS狀態(tài)為REDIRECT_HTTPS。
#這將重置它。這發(fā)生在Cake的前臺(tái)控制器
< IfModule setenvif_module>
SetEnvIf REDIRECT_HTTPS on HTTPS = on
< / IfModule>