CakePHP强制SSL - env('HTTPS')始终为null

时间:2012-01-06 18:26:37

标签: php cakephp ssl https cakephp-1.3

我尝试了很多不同的解决方案(herehereherehere),但几乎所有解决方案都导致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?

1 个答案:

答案 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可能会更进一步使用。