如何使用web.config文件强制使用HTTPS
我search了谷歌和StackOverflow试图find一个解决scheme,但他们似乎都涉及到ASP.NET等
我通常在我的服务器上运行Linux,但对于这个客户端,我正在使用IIS 7.5(和Plesk 10)的Windows。 这就是为什么我稍微不熟悉IIS和web.config文件的原因。 在.htaccess
文件中,您可以使用重写条件来检测协议是否为HTTPS并进行相应的redirect。 有没有简单的方法来实现这个使用web.config文件,甚至使用我已经安装的“ URL重写 ”模块?
我没有ASP.NET的经验,所以如果这涉及到解决scheme,那么请包括明确的步骤如何实施。
我这样做与web.config而不是 PHP的原因是,我想强制HTTPS的网站内的所有资产。
你需要URL重写模块,最好是V2(我没有安装V1,所以不能保证它会在那里工作,但它应该)。
这是一个这样的web.config的例子 – 它将强制所有资源的HTTPS(使用301永久redirect):
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <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> </rules> </rewrite> </system.webServer> </configuration>
PS这个特殊的解决scheme与ASP.NET / PHP或任何其他技术无关,因为它仅使用URL重写模块完成 – 在请求到达代码之前,它将在初始/较低级别之一处理得到执行。
对于那些使用ASP.NET MVC。 您可以使用RequireHttpsAttribute将所有响应强制为HTTPS:
GlobalFilters.Filters.Add(new RequireHttpsAttribute());
您可能还想要做的其他事情来帮助保护您的网站:
-
强制防伪令牌使用SSL / TLS:
AntiForgeryConfig.RequireSsl = true;
-
要求Cookie通过更改Web.config文件来默认要求HTTPS:
<system.web> <httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web>
-
使用NWebSec.Owin NuGet包并添加下面的代码行以跨站点启用严格的传输安全性(HSTS)。 不要忘记在下面添加Preload指令,并将您的站点提交到HSTS Preload站点 。 更多信息在这里和这里 。 请注意,如果您不使用OWIN,则可以在NWebSec站点上查阅 Web.config方法。
// app is your OWIN IAppBuilder app in Startup.cs app.UseHsts(options => options.MaxAge(days: 720).Preload());
-
使用NWebSec.Owin NuGet程序包并添加以下代码行以在整个站点上启用公钥保留(HPKP)。 更多信息在这里和这里 。
// app is your OWIN IAppBuilder app in Startup.cs app.UseHpkp(options => options .Sha256Pins( "Base64 encoded SHA-256 hash of your first certificate eg cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=", "Base64 encoded SHA-256 hash of your second backup certificate eg M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=") .MaxAge(days: 30));
-
在任何使用的URL中包含httpsscheme。 内容安全策略(CSP) HTTP头和子资源完整性(SRI)在您在某些浏览器中模仿该scheme时效果不佳 。 明确HTTPS更好。 例如
<script src="ajax/bootstrap/3.3.4/bootstrap.min.js"> </script>
-
使用ASP.NET MVC Boilerplate Visual Studio项目模板生成一个包含所有这些内置项目的项目。您还可以在GitHub上查看代码。
为了增加LazyOne的答案,这里是一个注释版本的答案。
<rewrite> <rules> <clear /> <rule name="Redirect all requests to https" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" /> </rule> </rules> </rewrite>
清除此服务器上可能已经定义的所有其他规则。 创build一个新规则,我们将命名为“将所有请求redirect到https”。 处理完此规则后,请不要再处理规则! 匹配所有传入的url。 然后检查是否所有这些其他条件都是正确的:HTTPS被closures。 那么,这只是一个条件(但要确保它是真的)。 如果是,请发送301永久redirect到http://www.foobar.com/whatever?else=the#url-contains
处的客户端。 不要在查询string的末尾添加查询string,因为它会复制查询string!
这就是属性,属性和一些值的含义。
- 清除将删除我们可能inheritance的所有服务器规则。
- 规则定义了一条规则。
- 为该规则命名任意(尽pipe是唯一的)名称。
- stopProcessing是立即转发请求到IIS请求pipe道还是首先处理其他规则。
- 匹配何时运行此规则。
- url是用来评估url的模式
- 规定关于何时运行该规则的附加条件; 条件只有在第一个匹配时才被处理。
- logicalGrouping是否所有条件必须为true(
MatchAll
)或任何条件必须为true(MatchAny
); 类似于AND与OR。
- logicalGrouping是否所有条件必须为true(
- 添加添加必须满足的条件。
- input一个条件评估的input; input可以是服务器variables。
- 模式评估input的标准。
- 忽略大小写是否重要。
- 如果
match
和conditions
都是真的,那么该怎么做。- types通常可以是
redirect
(客户端)或rewrite
(服务器端)。 - url这个规则的结果是什么产生的; 在这种情况下,连接
https://
与两个服务器variables。 - redirectType HTTPredirect使用; 这一个是301永久性的。
- appendQueryString是否在结果
url
的末尾添加查询string; 在这种情况下,我们将其设置为false,因为{REQUEST_URI}
已经包含了它。
- types通常可以是
服务器variables是
-
{HTTPS}
这是OFF
或ON
。 -
{HTTP_HOST}
是www.mysite.com
,并且 -
{REQUEST_URI}
包含其余的URI,例如/home?key=value
- 浏览器处理
#fragment
(参见LazyOne的评论)。
- 浏览器处理
另见: https : //www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference
优秀的NWebsec库可以使用Web.config
upgrade-insecure-requests
标签将您的请求从HTTP升级到HTTPS:
<nwebsec> <httpHeaderSecurityModule> <securityHttpHeaders> <content-Security-Policy enabled="true"> <upgrade-insecure-requests enabled="true" /> </content-Security-Policy> </securityHttpHeaders> </httpHeaderSecurityModule> </nwebsec>
接受的答案不适合我。 我按照这个博客的步骤。
对于我来说缺less的关键是我需要下载并安装IIS的URL重写工具。 我在这里find了 结果如下。
<rewrite> <rules> <remove name="Http to Https" /> <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true"> <match url="*" /> <conditions> <add input="{HTTPS}" pattern="off" /> </conditions> <serverVariables /> <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" /> </rule> </rules> </rewrite>
我没有被允许在我的环境中安装URL重写。
所以,我find了另一条路。
添加到我的web.config添加了错误重写,并在IIS 7.5上工作
<system.webServer> <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" > <remove statusCode="403" subStatusCode="4" /> <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" /> </httpErrors>
然后,按照这里的build议: https : //www.sslshopper.com/iis7-redirect-http-to-https.html
我创build了redirect的html文件(redirectToHttps.html):
<html> <head><title>Redirecting...</title></head> <script language="JavaScript"> function redirectHttpToHttps() { var httpURL= window.location.hostname + window.location.pathname + window.location.search; var httpsURL= "https://" + httpURL; window.location = httpsURL; } redirectHttpToHttps(); </script> <body> </body> </html>
我希望有人觉得这很有用,因为我无法在其他地方find所有的作品。
一个简单的方法是告诉IIS发送HTTP请求的自定义错误文件。 然后,文件可以包含元redirect,JavaScriptredirect和链接指令等等。重要的是,您仍然可以检查站点(或文件夹)的“需要SSL”,这将工作。
</configuration> </system.webServer> <httpErrors> <clear/> <!--redirect if connected without SSL--> <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/> </httpErrors> </system.webServer> </configuration>