刚刚移动了服务器,现有代码现在显示出一个奇怪的问题。
代码的要点是捕获'安全'黑洞错误,并将其重定向到该页面的安全版本。它是在旧服务器上进行的,但现在表现得很奇怪。
// App Controller
public function beforeFilter() {
$this->Security->blackHoleCallback = 'blackhole';
}
public function blackhole($type) {
switch($type) {
case 'secure':
debug(Router::url($this->here, true));
exit;
$this->redirect('https://' . env('SERVER_NAME') . $this->here);
break;
}
}
调试显示:“http://www.example.com/”
但我的浏览器显示“https://www.example.com/”(注意S)
答案 0 :(得分:1)
更好的答案是根本不使用此功能。
您不应该在代码中重定向到HTTPS。您应该使用Strict-Transport-Security
。这仍然涉及重定向,但它还涉及设置额外的标题。
您可以使用mod_ssl的功能:
SSLOptions +StrictRequire
SSLRequireSSL
请注意,SSLRequireSSL
指令将拒绝所有未启用SSL的请求。
正常重定向:
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
这基本上重写了使用HTTPS作为403重定向的请求。
您还想设置Strict-Transport-Security
标题:
Header set Strict-Transport-Security "max-age=8640000;includeSubdomains"
完成了。无需使用Cake。在服务器级别处理它,因为它是服务器级别。这意味着没有错误的请求甚至可以进入......
答案 1 :(得分:0)
我在这里找到了类似问题的答案:How can I securely detect SSL in CakePHP behind an nginx reverse proxy?
//AppController::beforeFilter
public function beforeFilter() {
$this->request->addDetector('ssl', array(
'env' => 'HTTP_X_FORWARDED_PROTO',
'value' => 'https'
));
}
我的应用现在可以正确检测HTTPS。
答案 2 :(得分:-1)
public function beforeFilter() {
$this->Security->blackHoleCallback = 'blackhole';
$this->Security->requireSecure();
}