Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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
Php 在Yii2上强制使用HTTPS_Php_Iis_Yii2_Yii2 Advanced App - Fatal编程技术网

Php 在Yii2上强制使用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

要求

如何在Yi2上强制重定向到https(如果用户访问http则重定向)?我已经尝试过web.config强制使用https,但没有成功

场景


我正在使用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]");
    }
}