在cakephp ssl站点中重定向到http而不是https
我已经开发了一个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在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]
蒂姆我有点猜测,但我怀疑正是这条规则把事情搞砸了 你应该“重定向”而不是“重写”。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解决方案和我自己的解决方案,修复后它们都能正常工作
蒂姆的例子已经在食谱中提到了
烹饪书中已经提到了它的例子