在 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.php
的 on 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
。
对于 $_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 Yii2
在 common
目录中做这个配置。
要求
如何在 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.php
的 on 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
。
对于 $_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 Yii2
在 common
目录中做这个配置。