Php 在Yii2上强制使用HTTPS
要求 如何在Yi2上强制重定向到https(如果用户访问http则重定向)?我已经尝试过web.config强制使用https,但没有成功 场景Php 在Yii2上强制使用HTTPS,php,iis,yii2,yii2-advanced-app,Php,Iis,Yii2,Yii2 Advanced App,要求 如何在Yi2上强制重定向到https(如果用户访问http则重定向)?我已经尝试过web.config强制使用https,但没有成功 场景 我正在使用IIS 7.5上托管的Yii2高级应用程序。Yii2实际上非常简单,因为有一个预定义的方法供您检查。只需要三个步骤: 1.扩展应用程序类 扩展默认的yii web应用程序类并重写handleRequest-方法。使用现有的Yii2功能检查连接是否安全 class MyApplication extends \yii\web\Applicati
我正在使用IIS 7.5上托管的Yii2高级应用程序。Yii2实际上非常简单,因为有一个预定义的方法供您检查。只需要三个步骤: 1.扩展应用程序类 扩展默认的yii web应用程序类并重写
handleRequest
-方法。使用现有的Yii2功能检查连接是否安全
class MyApplication extends \yii\web\Application
{
public function handleRequest($request)
{
//check if connection is secure
if (!$request->isSecureConnection) {
//otherwise redirect to same url with https
$secureUrl= str_replace('http', 'https', $request->absoluteUrl);
//use 301 for a permanent redirect
return Yii::$app->getResponse()->redirect($secureUrl, 301);
} else {
//if secure connection call parent implementation
return parent::handleRequest($request);
}
}
}
2.在index.php中使用新类
在web
-文件夹的index.php
中,只需使用新的应用程序类,而不是创建应用程序实例的常规类
3.完成!
事实上就是这样…:)!希望有帮助 在IIS上非常简单。可以使用重写模块来解决此问题。 例如:
这是非常有效和快速的。可以用于我们自己的CDN url,无需PHP代码的帮助。此代码也可用于ASP.Net。在这种情况下,请删除隐藏Yii索引部分。只需在
操作前的事件中添加规则
'on beforeAction' => function ($event) {
if (!(
(!empty($_SERVER['HTTPS']) AND $_SERVER['HTTPS'] != 'off') ||
$_SERVER['SERVER_PORT'] == 443
)) {
return Yii::$app->controller->redirect("https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}
}
此代码检查用户请求是否不是http
,然后将其移动到https
从:
对于$\u服务器['HTTPS']
如果通过HTTPS协议查询脚本,则设置为非空值
注意:请注意,当将ISAPI与IIS一起使用时,如果请求不是通过HTTPS协议发出的,则该值将关闭
所以这段代码应该适用于IIS
对于$\u服务器['SERVER\u PORT']:
注意:在Apache2下,必须将UseCononicalName=On和UseCononicalPhysicalPort=On设置为获取物理(真实)端口,否则,此值可能会被伪造,并且它可能会返回物理端口值,也可能不会返回物理端口值。在依赖于安全性的上下文中依赖此值是不安全的
所以,如果您在这段代码中有任何问题,您可以阻止在规则中使用$\u SERVER['SERVER\u PORT']
最后,如果您想在advanced Yii2
目录中进行此配置,请在common
目录中进行此配置。如果您使用apache2,为什么不能设置RewriteRule,或者更改nginx配置以从http重定向到https?本文似乎有助于IIS重写到https。是IIS。我在web.config上尝试了一些重定向规则,但没有成功。这是在应用程序检查请求没有以404 not Found结束后发生的吗?我想我希望这样,所有无效的垃圾邮件请求在最终得到404之前不会得到302。。。或者这实际上是资源密集型的,因为对于真正的请求,它将开始处理请求两次?对于那些甚至不想使用302的垃圾邮件发送者来说,这节省了我们处理整个请求的时间……如果路由无效,这实际上就是将您的请求解析为404的方法。因此准确地说,returnparent::handleRequest($request)
将触发404。回答你的问题:你可以先拿到302/301,然后再拿到404。为了防止出现这种情况,您可以首先调用parent::handleRequest($request)
并捕获异常(如果存在异常),然后按照上面提到的方法继续。您可以找到应用程序类的源代码!请提供web目录的index.php示例。使用新的应用程序类,而不是。。。。
'on beforeAction' => function ($event) {
if (!(
(!empty($_SERVER['HTTPS']) AND $_SERVER['HTTPS'] != 'off') ||
$_SERVER['SERVER_PORT'] == 443
)) {
return Yii::$app->controller->redirect("https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}
}