在 Yii2 上强制使用 HTTPS

Force HTTPS on Yii2

要求

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

场景

我正在使用托管在 IIS 7.5 上的 Yii2 高级应用程序。

在 Yii2 中实际上非常简单,因为有一个预定义的检查方法。只需三个步骤:

1。扩展应用程序 class

扩展默认的 yii 网络应用程序 class 并覆盖 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

中使用新的 class

在您的 web 文件夹的 index.php 中,只需使用您的新应用程序 -class 而不是创建应用程序实例的常规应用程序。

3。完成!

实际上就是这样...:)!希望对您有所帮助!

在 IIS 上非常简单。可以使用重写模块来解决这个问题。 例如,

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>

    <!-- Other stuffs -->

        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>

                <rule name="Hide Yii Index" stopProcessing="true">
                    <match url="." ignoreCase="false" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" appendQueryString="true" />        
                </rule>


            </rules>
        </rewrite>

    <!-- Other stuffs -->
    </system.webServer>    
</configuration>

它非常有效且快速。无需 PHP 代码即可用于我们自己的 CDN url。
此代码也可用于 ASP.Net。在这种情况下,删除 Hide Yii Index 部分。

只需在 config.phpon beforeAction 事件中添加您的规则。

'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

来自PHP.net documentation :

对于 $_SERVER['HTTPS']

Set to a non-empty value if the script was queried through the HTTPS protocol.

Note: Note that when using ISAPI with IIS, the value will be off if the request was not made through the HTTPS protocol.

因此此代码应该适用于 IIS。

对于 $_SERVER['SERVER_PORT']:

Note: Under the Apache 2, you must set UseCanonicalName = On, as well as UseCanonicalPhysicalPort = On in order to get the physical (real) port, otherwise, this value can be spoofed and it may or may not return the physical port value. It is not safe to rely on this value in security-dependent contexts.

所以如果你在这段代码中有任何问题,你可以阻止在规则中使用 $_SERVER['SERVER_PORT']

最后,如果你想做整个 advanced Yii2common 目录中做这个配置。