如何使用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()); 

您可能还想要做的其他事情来帮助保护您的网站:

  1. 强制防伪令牌使用SSL / TLS:

     AntiForgeryConfig.RequireSsl = true; 
  2. 要求Cookie通过更改Web.config文件来默认要求HTTPS:

     <system.web> <httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web> 
  3. 使用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()); 
  4. 使用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)); 
  5. 在任何使用的URL中包含httpsscheme。 内容安全策略(CSP) HTTP头和子资源完整性(SRI)在您在某些浏览器中模仿该scheme时效果不佳 。 明确HTTPS更好。 例如

     <script src="ajax/bootstrap/3.3.4/bootstrap.min.js"> </script> 
  6. 使用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。
  • 添加添加必须满足的条件。
    • input一个条件评估的input; input可以是服务器variables。
    • 模式评估input的标准。
    • 忽略大小写是否重要。
  • 如果matchconditions都是真的,那么该怎么做。
    • types通常可以是redirect (客户端)或rewrite (服务器端)。
    • url这个规则的结果是什么产生的; 在这种情况下,连接https://与两个服务器variables。
    • redirectType HTTPredirect使用; 这一个是301永久性的。
    • appendQueryString是否在结果url的末尾添加查询string; 在这种情况下,我们将其设置为false,因为{REQUEST_URI}已经包含了它。

服务器variables是

  • {HTTPS}这是OFFON
  • {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>