我尝试了很多不同的解决方案(here,here,here,here),但几乎所有解决方案都导致404或无限循环
最后我发现this question似乎最接近工作;但是当我尝试加载我希望要求SSL的其中一个操作时,它也会导致Firefox出错:
该页面未正确重定向
Firefox检测到服务器正在重定向请求 这个地址永远不会完成。
此问题有时可能是由禁用或拒绝引起的 接受cookies。
最后通过一系列调试,我发现env('HTTPS')
由于某种原因(null
和$this->RequestHandler->isSsl();
)总是会返回$_SERVER['HTTPS']
,即使我在{m}使用HTTPS连接。我无法理解为什么会这样,因为我的浏览器报告我是SSL安全的,我的证书似乎安装得正确。
nginx服务器
listen 80;
listen 443 ssl;
ssl_certificate /etc/ssl/certs/domain.chain.crt;
ssl_certificate_key /etc/ssl/private/domain.key;
...
App Controller
var $secureItems = array('login', 'edit', 'viewDocs');
function beforeFilter() {
$this->Auth->allow('index', 'display');
$this->set('loggedUser', $this->Auth->user());
$this->__checkSSL();
}
__checkSSL()
和支持函数直接来自之前的链接问题(this one)。
只要我在$secureItems
中执行其中一项操作(无论是HTTP还是HTTPS),它在HTTP和HTTPS中都可以很好地加载,它会无限重定向。
感谢任何帮助!
修改:
我很确定问题是由env('HTTPS')
始终为空引起的无限循环。由于它为null,因此检查条件始终为false,并使其重定向到HTTPS URL,即使它已经在一个URL上。
我可以通过其他方式检查HTTPS,还是有人可以告诉我为什么env('HTTPS')
始终返回null?
答案 0 :(得分:2)
你的编辑是朝着正确方向迈出的一步......
Web服务器设置环境变量,例如$_SERVER['HTTPS']
。
如果没有值,你需要看一下Web服务器 - 你的案例中的nginx - 或者中间的任何web服务器(反向代理等)
我对nginx上的SSL没有任何经验,但从我可以收集到的内容中,您需要确保nginx正在为端口443上的连接发送fastcgi_param HTTPS on
。
添加这样的东西,或许:
server {
listen 443;
server_name example.com;
ssl on;
fastcgi_param HTTPS on;
# ...
}
搜索"nginx fastcgi_param HTTPS"以获取其他配置示例。
我还发现some other variables可能会更进一步使用。