Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cakephp ssl站点中重定向到http而不是https_Cakephp_Ssl_Redirect_Https_Router - Fatal编程技术网

在cakephp ssl站点中重定向到http而不是https

在cakephp ssl站点中重定向到http而不是https,cakephp,ssl,redirect,https,router,Cakephp,Ssl,Redirect,Https,Router,我已经开发了一个cakephp站点,它应该对所有页面使用ssl。除了在控制器中使用重定向时,它会重定向到http://subdomain.domain.com,而不是https://subdomain.domain.com/controller/action,它会按预期工作 我通过为端口80创建一个指向cakephp应用程序的虚拟主机来解决这个问题,并在.htaccess中添加了这些重写规则 重写条件%{HTTPS}关闭 重写规则(.*){HTTP_HOST}%{REQUEST_URI}[L]

我已经开发了一个cakephp站点,它应该对所有页面使用ssl。除了在控制器中使用重定向时,它会重定向到http://subdomain.domain.com,而不是https://subdomain.domain.com/controller/action,它会按预期工作

我通过为端口80创建一个指向cakephp应用程序的虚拟主机来解决这个问题,并在.htaccess中添加了这些重写规则

重写条件%{HTTPS}关闭 重写规则(.*){HTTP_HOST}%{REQUEST_URI}[L]

这会捕获这种情况并重定向到https,但这会给服务器带来不必要的额外流量

产生这种额外流量的原因是重定向功能,因为它会生成错误的URL。我已经研究了重定向函数,它调用router::url来创建实际的url。然而,我不知道如何或在哪里指示路由器使用https而不是http


蒂姆

我有点猜测,但我怀疑正是这条规则把事情搞砸了

你应该“重定向”而不是“重写”。Cake生成的链接通常是相对于根的,因此除非将“true”作为第二个参数传递,否则不要指定协议

我还让apache监听80和443,这样我至少可以响应错误的请求

这是我在AppController类中执行相同操作的代码:

function beforeFilter() {
    parent::beforeFilter();
    $this->_setupSecurity();
}

function _setupSecurity() {
    $this->Security->blackHoleCallback = '_badRequest';
    if(Configure::read('forceSSL')) {
        $this->Security->requireSecure('*');
    }
}

/**
* The main SecurityComponent callback.
* Handles both missing SSL problems and general bad requests.
*/

function _badRequest() {
    if(Configure::read('forceSSL') && !$this->RequestHandler->isSSL()) {
        $this->_forceSSL();
    } else {
        $this->cakeError('error400');
    }
    exit;
}

/**
* Redirect to the same page, but with the https protocol and exit.
*/

function _forceSSL() {
    $this->redirect('https://' . env('SERVER_NAME') . $this->here);
    exit;
}

我在bootstrap.php中也有自己的配置“forceSSL”选项,用于根据环境打开和关闭此选项,因此需要将其设置为true才能使上述内容正常工作。

我有点猜测,但我怀疑正是这条规则把事情搞砸了

你应该“重定向”而不是“重写”。Cake生成的链接通常是相对于根的,因此除非将“true”作为第二个参数传递,否则不要指定协议

我还让apache监听80和443,这样我至少可以响应错误的请求

这是我在AppController类中执行相同操作的代码:

function beforeFilter() {
    parent::beforeFilter();
    $this->_setupSecurity();
}

function _setupSecurity() {
    $this->Security->blackHoleCallback = '_badRequest';
    if(Configure::read('forceSSL')) {
        $this->Security->requireSecure('*');
    }
}

/**
* The main SecurityComponent callback.
* Handles both missing SSL problems and general bad requests.
*/

function _badRequest() {
    if(Configure::read('forceSSL') && !$this->RequestHandler->isSSL()) {
        $this->_forceSSL();
    } else {
        $this->cakeError('error400');
    }
    exit;
}

/**
* Redirect to the same page, but with the https protocol and exit.
*/

function _forceSSL() {
    $this->redirect('https://' . env('SERVER_NAME') . $this->here);
    exit;
}

我在bootstrap.php中也有自己的配置“forceSSL”选项,用于根据环境打开和关闭此选项,因此需要将其设置为true才能使上述内容正常工作。

我发现错误,这是Apache的错误配置

在尝试Jamies解决方案时,该站点最终陷入重定向循环,因为即使请求是https,RequestHandler->isSSL()也返回false。然后我发现$_服务器['https']没有设置,$_服务器['port']是80,而不是预期的443

此时,我已将ssl指令放置在可用/默认站点中

SSLEngine on
SSLCertificateFile [path to cert file]
SSLCertificateKeyFile [path to keyfile]

通过重定向循环,将ssl指令移动到子域的虚拟主机解决了该问题

实际上,这也解决了我最初的问题,因为方法Router::url会检查$\u SERVER['https'],如果设置它,它会生成一个以https:开头的url,否则只会检查http:

我已经用.htaccess中的重写规则测试了Jameies解决方案和我自己的解决方案,修复后它们都能正常工作


蒂姆

我发现了这个错误,这是对Apache的错误配置

在尝试Jamies解决方案时,该站点最终陷入重定向循环,因为即使请求是https,RequestHandler->isSSL()也返回false。然后我发现$_服务器['https']没有设置,$_服务器['port']是80,而不是预期的443

此时,我已将ssl指令放置在可用/默认站点中

SSLEngine on
SSLCertificateFile [path to cert file]
SSLCertificateKeyFile [path to keyfile]

通过重定向循环,将ssl指令移动到子域的虚拟主机解决了该问题

实际上,这也解决了我最初的问题,因为方法Router::url会检查$\u SERVER['https'],如果设置它,它会生成一个以https:开头的url,否则只会检查http:

我已经用.htaccess中的重写规则测试了Jameies解决方案和我自己的解决方案,修复后它们都能正常工作


蒂姆的例子已经在食谱中提到了


烹饪书中已经提到了它的例子