我想为某些控制器强制使用SSL,并为其他所有控件删除SSL。前段时间我在自定义Controller类的_init()中有一个片段,它没有像我希望的那样工作:
$ssl = $this->request->is('ssl');
$forceSecured = in_array($this->request->controller, array('Orders', 'Customers'));
//remove SSL for non-ssl pages
if ($ssl && !$forceSecured) {
return $this->redirect(Router::match(
$this->request->params,
$this->request,
array('absolute' => true, 'scheme' => 'http://')
)
);
}
// Force ssl on for ssl pages
if (!$ssl && $forceSecured) {
return $this->redirect(Router::match(
$this->request->params,
$this->request,
array('absolute' => true, 'scheme' => 'https://')
)
);
}
我支持遗留应用程序,因此我定义了多个硬编码路由。我确信我可以在Router :: connect中使用处理程序,但我宁愿对所有请求进行检查。继续路线是否可以到达这里?
答案 0 :(得分:3)
两件事:(1)你不能从Response
返回_init()
对象(这是redirect()
返回的对象),以及(2)你有一个微妙的设计问题。我建议这样做:
protected $_secure = false;
public function __invoke($request, $params, array $options = array()) {
if (!$this->_secure && !$request->is('ssl')) {
return parent::__invoke($request, $params, $options);
}
return $this->redirect(Router::match($request->url, $request, [
'absolute' => true, 'scheme' => 'https://'
]));
}
<强>观察:强>
答案 1 :(得分:0)
为什么要让它进入应用程序?如果要阻止特定路由强制ssl,请使用htaccess重写。
Ssl是一个传输协议细节,与您的站点代码无关,让apache(或nginx)处理这些细节。将责任分离到最适合处理的事情。
如果您提供exac网址,我想确定somone可以帮助重写条件逻辑