如何使用web.config文件强制HTTPS


220

我搜索过Google和StackOverflow,试图找到解决方案,但它们似乎都与ASP.NET等有关。

我通常在服务器上运行Linux,但是对于这个客户端,我使用的是带有IIS 7.5(和Plesk 10)的Windows。这就是为什么我稍微不熟悉IIS和web.config文件的原因。在.htaccess文件中,您可以使用重写条件来检测协议是否为HTTPS并进行相应的重定向。是否有使用web.config文件甚至使用已安装的“ URL Rewrite ”模块来实现此目的的简单方法

没有ASP.NET的经验,因此,如果解决方案中涉及此内容,请提供清晰的实现步骤。

之所以使用web.config而不是 PHP来执行此操作,是因为我想对站点内的所有资产强制使用HTTPS。



Answers:


427

您需要URL重写模块,最好是v2(我没有安装v1,因此不能保证它会在那里工作,但是应该可以)。

这是此类web.config的示例-它将对所有资源强制使用HTTPS(使用301永久重定向):

<?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 此特定解决方案与ASP.NET/PHP或任何其他技术无关,因为它仅使用URL重写模块完成-它在初始/较低级别之一中进行处理-在请求到达您的代码之前被执行。


6
@BenCarey您还应该查看Strict-Transport-Security标题:en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne 2012年

22
我建议更改重定向,以使其不附加查询字符串,因为它已经是{REQUEST_URI}的一部分(否则,参数将被添加两次)。 <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
franzo 2014年

6
这可以工作,但不幸的是在本地主机上也可以。为避免这种情况,您可以将其添加到<conditions>:<add input =“ {HTTP_HOST}” pattern =“ localhost” negate =“ true” />
wezzix

5
使用AWS Elastic beantalk,此方法给了我302次重定向,直到我修改为止:<match url=".*"/><match url="http://*.*" />
Kevin

1
@Sam也许您没有安装URL重写模块?默认情况下,它不随IIS一起提供,需要单独安装。如docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/...
LazyOne

80

对于那些使用ASP.NET MVC的用户。您可以使用RequireHttpsAttribute强制所有响应为HTTPS:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

您可能还需要采取其他措施来保护您的网站安全:

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

    AntiForgeryConfig.RequireSsl = true;
  2. 默认情况下,通过更改Web.config文件,Require Cookies要求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 e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
  5. 在使用的任何URL中包括https方案。在某些浏览器中模仿内容安全策略(CSP) HTTP标头和子资源完整性(SRI)时,效果不佳。最好对HTTPS明确。例如

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. 使用ASP.NET MVC Boilerplate Visual Studio项目模板生成具有所有这些以及更多内置功能的项目。您还可以在GitHub上查看代码。


4
该问题要求使用ASP.NET,但未声明WebForms或MVC,因此我为使用MVC的用户(未使用Web.config文件强制使用HTTPS)提供了全面的答案,但是...被否决了。
穆罕默德·雷汉

6
a)解决方案有效,但是情况已经改变,这个突出的,高评分的问题应该使用MVC内置的功能来更新答案。b)答案试图覆盖所有基础。问题并不简单,在整个站点上启用HTTPS不仅需要更改web.config文件。读者可能会误以为只需更改Web.config文件即可。安全性足够高,因为它没有不完整/过时的答案。
穆罕默德·雷汉

11
我认为这是一个极好的和有价值的答案。当有人用谷歌搜索该主题并针对这个问题时,我很高兴您的回答在这里。
总统詹姆斯·波尔克(James K. Polk)2015年

1
@MuhammadRehanSaeed尼斯帖子。也许将SRI添加到您的列表中?scotthelme.co.uk/subresource-integrity
Nathan

1
@MuhammadRehanSaeed正确-我想您的标题“您可能还想做以帮助保护您的网站的其他事情”让我想到了:)
内森

14

为了扩大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>

清除此服务器上可能已经定义的所有其他规则。创建一个新规则,我们将其命名为“将所有请求重定向到https”。处理完此规则后,请勿再处理任何规则!匹配所有传入的URL。然后检查所有其他条件是否都满足:HTTPS已关闭。好吧,这只是一个条件(但请确保它是正确的)。如果是这样,请在发送301永久重定向回客户端http://www.foobar.com/whatever?else=the#url-contains。不要在结尾添加查询字符串,因为它会重复查询字符串!

这就是属性,属性和某些值的含义。

  • clear删除所有我们可能会继承的服务器规则。
  • 规则定义规则。
    • 为规则命名一个任意(尽管唯一)的名称。
    • stopProcessing是将请求立即转发到IIS请求管道,还是先处理其他规则。
  • 匹配何时运行此规则。
    • url用来评估URL的模式
  • 条件何时执行该规则的附加条件; 仅在首先存在匹配项时才处理条件。
    • logicalGrouping是否所有条件都必须为true(MatchAll)或任何条件都必须为true(MatchAny);类似于AND与OR。
  • 添加添加必须满足的条件。
    • 输入条件正在评估的输入;输入可以是服务器变量。
    • 模式化用于评估输入的标准。
    • 忽略大小写是否重要。
  • 行动,如果matchconditions都为真该怎么办。
    • 类型通常可以是redirect(客户端)或rewrite(服务器端)。
    • url根据该规则产生的结果;在这种情况下,请https://与两个服务器变量串联。
    • redirectType使用什么HTTP重定向;这是一个永久的301。
    • appendQueryString是否在结果的末尾添加查询字符串url;在这种情况下,我们将其设置为false,因为{REQUEST_URI}已经包含了它。

服务器变量是

  • {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


1
不过要注意一点:/home?key=value#fragment浏览器未将URL的片段部分(来自)设置为服务器,因为它打算在本地使用。
LazyOne

@LazyOne问题。我们正在成功使用上面的web.config从greenearth.game/about#foo重定向到HTTPS。切换到HTTPS包含#foo片段。鉴于#foo部分未发送到服务器,重定向如何包含它?
Shaun Luttin

由浏览器处理。只需在Google Chrome浏览器中打开“网络”标签(或Firefox等类似功能),然后查看实际请求的URL(例如,http://www.example.com/members#oops将发送请求的URL http://www.example.com/members,然后将其重定向到HTTPS版本,https://www.example.com/members其余部分由浏览器完成)
LazyOne

@LazyOne谢谢你。如果我没记错的话,有一些WebKit错误会阻止该片段包含在重定向中。因此,这很有意义。bugs.webkit.org/show_bug.cgi?id=24175
Shaun Luttin

1
en.wikipedia.org/wiki/Fragment_identifier - “客户不应该URI片段发送到服务器时,他们检索文档,并没有从本地应用程序的帮助(见下文)片段不参与HTTP重定向” -为了清楚起见,以防万一我误解了您的最后评论。
LazyOne

6

接受的答案对我不起作用。我按照此博客上的步骤进行操作。

我缺少的一个关键点是我需要下载并安装IIS的URL重写工具。我在这里找到的。结果如下。

<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>

1

在.Net Core中,请按照https://docs.microsoft.com/zh-cn/aspnet/core/security/enforcing-ssl上的说明进行操作

在您的startup.cs中添加以下内容:

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

要将Http重定向到Https,请在startup.cs中添加以下内容

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

0

出色的NWebsec库可以使用以下upgrade-insecure-requests标记将您的请求从HTTP升级到HTTPS Web.config

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

0

不允许在我的环境中安装URL Rewrite,因此,我找到了另一条路径。

将此添加到我的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>

然后,按照此处的建议进行操作:https : //www.sslshopper.com/iis7-redirect-http-to-https.html

我创建了执行重定向的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>

我希望有人觉得这很有用,因为我无法在其他任何地方的某个地方找到所有作品。


-7

一种简单的方法是告诉IIS为HTTP请求发送自定义错误文件。然后,该文件可以包含元重定向,JavaScript重定向以及带有链接的说明等。重要的是,您仍然可以为站点(或文件夹)选中“需要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>

为什么要下票?它可以工作并回答问题。
重新导向

14
这是投反对票,因为您要告诉Google找不到文件,然后使用JavaScript重定向,这通常很糟糕。
Thomas Bennett
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.