在Yii2上强制HTTPS

时间:2015-09-14 09:31:37

标签: yii2 yii2-advanced-app

要求

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

方案

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

3 个答案:

答案 0 :(得分:6)

Its actually very easy in Yii2 as there is a predefined method for your check. Just three steps needed:

1. Extend the application class

Extend the default yii web-application class and override the handleRequest-method. Use the existing Yii2-function to check if the connection is secure.

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. Use new class in index.php

Within the index.php of your web-folder simply use your new application-class instead of the regular one where the application-instance is created.

3. Done!

That's it actually... :)! Hope it helps!

答案 1 :(得分:1)

只需在on beforeAction的{​​{1}}事件中添加规则即可。

config.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]"); } } ,然后将其移至http

来自PHP.net documentation

用于 $ _ SERVER ['HTTPS']

  

如果通过HTTPS协议查询脚本,则设置为非空值。

     

注意:请注意,将ISAPI与IIS一起使用时,如果未通过HTTPS协议发出请求,则该值将关闭。

因此此代码应适用于IIS。

用于 $ _ SERVER ['SERVER_PORT']

  

注意:在Apache 2下,必须设置UseCanonicalName = On以及UseCanonicalPhysicalPort = On才能获取物理(真实)端口,否则,该值可能会被欺骗并且可能会或可能不会返回物理端口。端口值。在与安全性相关的上下文中依赖此值并不安全。

因此,如果这段代码有任何问题,可以防止在规则中使用https

最后,如果要整个$_SERVER['SERVER_PORT']做此配置,请在advanced Yii2目录中进行。

答案 2 :(得分:0)

在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网址 此代码也可用于ASP.Net。在这种情况下,请删除隐藏Yii索引部分。