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

本文关键字:HTTPS 文件 何使用 web config | 更新日期: 2023-09-27 18:28:44

我已经在Google和StackOverflow中搜索了,试图找到解决这个问题的方法,但它们似乎都与 ASP.NET 等有关。

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

我没有 ASP.NET 的经验,所以如果这涉及解决方案,那么请包括如何实施的明确步骤。

我使用 web.config 而不是 PHP 这样做的原因是我想在站点内的所有资产上强制使用 HTTPS。

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

您需要 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>

附言这个特殊的解决方案与 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(。不要忘记在下面添加预加载指令,并将您的网站提交到 HSTS 预加载站点。更多信息在这里和这里。请注意,如果您不使用 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. 所使用的任何网址中包含 https 方案。内容安全策略 (CSP( HTTP 标头和子资源完整性 (SRI( 在某些浏览器中模仿该方案时效果不佳。最好明确说明HTTPS。例如

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. 使用 ASP.NET MVC 样板 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>

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

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

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

服务器变量为

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

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

我缺少的一个关键点是我需要下载并安装 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>

在 .Net Core 中,按照 https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl 中的说明进行操作

在启动中.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,请在启动中添加以下内容.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);

优秀的 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>

我正在使用下面的代码,它非常适合我,希望对您有所帮助。

<configuration>
<system.webServer>
    <rewrite>
        <rules>
            <rule name="Force redirect to https" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
<</div> div class="answers">

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

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

我将 IIS 网站配置为需要 SSL,并创建了在出现 403(禁止访问(错误时执行重定向(重定向到 Https.html(的 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>

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

当您在 AWS 上将 IIS 10 与应用程序负载均衡器一起使用时,您必须按如下方式配置重定向。

        <rule name="Force HTTPS" enabled="true" stopProcessing="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{HTTP_X_Forwarded_Proto}" pattern="^https$" negate="true" />
                <add input="{HTTP_HOST}" pattern="^(www'.)?dname'.com$" />
            </conditions>
            <action type="Redirect" url="https://www.dname.com{REQUEST_URI}" />
        </rule>

如果您有子域重定向,请使用以下内容:

        <!--START REDIRECT TO HTTPS-->
        <rule name="Force HTTPS" enabled="true" stopProcessing="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{HTTP_X_Forwarded_Proto}" pattern="^https$" negate="true" />
                <add input="{HTTP_HOST}" pattern="subdomain'.domain'.com$" />
            </conditions>
            <action type="Redirect" url="https://subdomain.domain.com{REQUEST_URI}" />
        </rule> 
        <!--END REDIRECT TO HTTPS-->    

一个简单的方法是告诉 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>