如何使用网络强制HTTPS。配置文件

我在谷歌和StackOverflow周围搜索,试图找到一个解决方案,但他们似乎都与ASP有关。净等。

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

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

我这样做的原因是。config和 PHP是我想在网站内的所有资产上强制HTTPS。

296958 次浏览

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

这是一个这样的网络的例子。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重写模块完成——在请求到达代码执行点之前,它在初始/较低的级别之一进行处理

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

对于那些使用ASP。净MVC。你可以使用RequireHttpsAttribute强制所有响应为HTTPS:

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

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

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

    AntiForgeryConfig.RequireSsl = true;
    
  2. Require Cookies to require HTTPS by default by changing the Web.config file:

    <system.web>
    <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. Use the NWebSec.Owin NuGet package and add the following line of code to enable Strict Transport Security (HSTS) across the site. Don't forget to add the Preload directive below and submit your site to the HSTS Preload site. More information here and here. Note that if you are not using OWIN, there is a Web.config method you can read up on on the NWebSec site.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Use the NWebSec.Owin NuGet package and add the following line of code to enable Public Key Pinning (HPKP) across the site. More information here and here.

    // 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. Include the https scheme in any URL's used. Content Security Policy (CSP) HTTP header and Subresource Integrity (SRI) do not play nice when you imit the scheme in some browsers. It is better to be explicit about HTTPS. e.g.

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Use the ASP.NET MVC Boilerplate Visual Studio project template to generate a project with all of this and much more built in. You can also view the code on GitHub.

出色的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>

为了补充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。不要在后面添加查询字符串,因为这会重复查询字符串!

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

  • 清晰的删除我们可能继承的所有服务器规则。
  • 规则定义规则。
    • 的名字规则的任意(尽管是唯一的)名称。
    • stopProcessing是立即将请求转发到IIS请求管道还是先处理附加规则。
    • 李< / ul > < / >
    • 匹配何时运行此规则。
      • url用于计算URL的模式
      • 李< / ul > < / >
      • 条件关于何时运行此规则的附加条件;只有在第一个匹配时才会处理条件。
        • logicalGrouping是否所有条件必须为真(MatchAll)或任何条件必须为真(MatchAny);类似于AND和OR。
        • 李< / ul > < / >
        • 添加添加一个必须满足的条件。
          • 输入条件正在计算的输入;输入可以是服务器变量。
          • 模式用于评估输入的标准。
          • ignoreCase是否大写重要。
          • 李< / ul > < / >
          • 行动如果match和它的conditions都为真,该做什么。
            • 类型通常可以是redirect(客户端)或rewrite(服务器端)。
            • url作为此规则的结果产生什么;在本例中,将https://与两个服务器变量连接。
            • redirectType HTTP重定向使用什么;这是301永久型的。
            • appendQueryString是否在结果url的末尾添加查询字符串;在本例中,我们将其设置为false,因为{REQUEST_URI}已经包含了它。
            • 李< / ul > < / >

            服务器变量为

接受的答案不适合我。 我遵循了博客.

. properties中的步骤

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

我不允许在我的环境中安装URL重写,所以,我找到了另一个路径。

把这个加到我的网里。config添加了错误重写,并适用于iis7.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,并创建了html文件,在403 (被禁止的)错误时执行重定向(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>

我希望有人发现这是有用的,因为我无法找到所有的碎片在一个地方在其他地方。

在.Net Core中,遵循https://learn.microsoft.com/en-us/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 . xml文件中添加以下内容

// 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);

我正在使用下面的代码,它完美地为我工作,希望它会帮助你。

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

当您在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-->