【问题标题】:Redirect to https works partially asp net core重定向到 https 部分工作 asp net core
【发布时间】:2020-07-12 20:57:08
【问题描述】:

我已将我的项目设置为始终重定向到 https,当用户键入 http://website.com or website.com 时它可以工作,但当他键入 http://www.website.com or https://www.website.com or www.website.com 时它不起作用

这是我的设置:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => false;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddHttpsRedirection(options =>
    {
        options.HttpsPort = 443;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Configure 里面我确实有app.UseHttpsRedirection();

项目在.NET Core 2.1开发

一段时间后,我又回到了这个问题,因为它还没有通过以下任何答案解决。

这是我启动的完整代码 - 因为我尝试了很多东西,所以它搞砸了,公平地说,我现在迷路了......

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Rewrite;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Termodom.Models;

namespace Termodom
{
    public class Startup
    {

        public static string Version = "v1.2.0.0";



        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            Initialize();
        }

        public IConfiguration Configuration { get; }

        private void Initialize()
        {
            AR.AR.ConnectionString = Program.ConnectionString;
            AR.ARWebAuthorization.ARWebAuthorization.AutoUserTimeout = true;
            AR.TDShop.Buffer.Started = true;
        }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            if (true == true) // Do not mind this
            {
                services.AddHsts(ops =>
                {
                    ops.Preload = true;
                    ops.IncludeSubDomains = true;
                });

                services.AddHttpsRedirection(options =>
                {
                    options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
                    options.HttpsPort = 443;
                });
            }

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            AR.Statistic.Visits.Initialize(Path.Combine(env.WebRootPath, "Statistics"));
            AR.Statistic.Visitors.Initialize(Path.Combine(env.WebRootPath, "Statistics"));

            var cultureInfo = new CultureInfo("en-US");
            cultureInfo.NumberFormat.NumberGroupSeparator = ",";
            cultureInfo.NumberFormat.NumberDecimalSeparator = ".";
            cultureInfo.NumberFormat.CurrencyDecimalSeparator = ",";
            cultureInfo.NumberFormat.CurrencyGroupSeparator = ",";
            CultureInfo.DefaultThreadCurrentCulture = cultureInfo;

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
                // app.UseRewriter(new RewriteOptions().AddRedirectToHttps(StatusCodes.Status301MovedPermanently, 443));
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

            app.Run(async (context) =>
            {
                Program.AbsolutePath = env.WebRootPath;
            });
        }
    }
}

【问题讨论】:

    标签: c# asp.net asp.net-core dns


    【解决方案1】:

    添加HstsOption 以包含子域:

    services.AddHsts(ops =>
    {
        ops.IncludeSubDomains = true;
    });
    

    我假设您在启动时已经有app.UseHttpsRedirection();,对吧?

    参考:

    【讨论】:

      【解决方案2】:

      只需在 Laz Ziya 点添加以下代码 sn-p 即可, 在我的一个项目中使用了相同的。希望你用过 HttpsRedirection() 方法正确检查一下,端口可以 appsettings.json 中提到的


      块引用

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
          if (env.IsDevelopment())
          {
              app.UseDeveloperExceptionPage();
          }
          else
          {
              app.UseExceptionHandler("/Error");
              // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
              app.UseHsts();
          }
      
          app.UseHttpsRedirection();
          app.UseStaticFiles();
      
          app.UseRouting();
      
          app.UseAuthorization();
      
          app.UseEndpoints(endpoints =>
          {
              endpoints.MapRazorPages();
          });
      }
      
      【解决方案3】:

      TL;DR 您的 HTTPS 中间件设置正确,但您的 Web 应用程序本身可能没有收听 www.website.com。 配置您的 Web 服务器(IIS、kestrel、apache 或任何其他)和(或)DNS 提供程序以解析来自 www.website.comwebsite.com 的请求到您的 Web 应用程序

      长篇大论

      HttpsRedirection 中间件 (app.UseHttpsRedirection()) 与用于访问您的应用程序的 URL 无关。

      即无论您使用http://website.com 还是http://abc.xyz.website.com:2312,中间件都会分别正确重定向到https://website.com:443http://abc.xyz.website.com:443。 (假设 HttpsPort 设置为 443)

      参考https://github.com/dotnet/aspnetcore/blob/master/src/Middleware/HttpsPolicy/src/HttpsRedirectionMiddleware.cs

              var port = _httpsPort.Value;
              if (port == PortNotFound)
              {
                  return _next(context);
              }
      
              var host = context.Request.Host;
              if (port != 443)
              {
                  host = new HostString(host.Host, port);
              }
              else
              {
                  host = new HostString(host.Host);
              }
      
              var request = context.Request;
              var redirectUrl = UriHelper.BuildAbsolute(
                  "https", 
                  host,
                  request.PathBase,
                  request.Path,
                  request.QueryString);
      

      在 Nutshell 中,中间件所做的就是使用用于访问您的应用程序的原始 URL,并将原始端口更改为 443 (HttpsPort)。

      现在至于为什么您可能会遇到这个问题,您的应用程序(或应用程序服务器)本身可能没有监听来自 http://www.website.com 的请求。

      如果您使用的是 kestrel,您可以将其配置为侦听端口 80 和 443 上的所有请求。

      "Kestrel": {
          "EndPoints": {
            "Http": {
              "Url": "http://0.0.0.0:80"
            },
            "Https": {
              "Url": "https://0.0.0.0:443"
            }
          }
        },
      

      如果您在本地机器上进行测试,那么您必须为您的应用程序正在侦听的所有子域(www 在您的情况下)将单独的条目添加到主机文件中。
      (主机文件位于 Linux 中的 /etc/hosts 和 Windows 中的 C:\Windows\System32\drivers\etc\hosts
      例如

      #various other entries.
      127.0.0.1 www.website.com
      127.0.0.1 website.com
      

      在生产环境中,您必须配置 DNS 提供程序以将 www.website.com && website.com 解析为托管您的应用的 IP 地址。

      其他一些有用的链接
      How to set up subdomains on IIS 7
      https://superuser.com/questions/449392/multiple-subdomains-pointing-to-one-website-in-iis

      【讨论】:

      • 您是否真的尝试检查您的网络服务器是否正在侦听 www 子域上的请求?在website.com 或 www.website.com 上请求时,您的网站无法正常工作这一事实是其主要指标。为了完全确定,在管道的最开始插入一个虚拟中间件,放置一个断点并检查它是否在您从 www.website.com 发送请求时被命中。如果您没有收到任何信息,那么这不是您的代码的错,而是您的服务器配置,例如imgur.com/KoLhLQX
      • 我找到了解决方案,但与此问题无关。看起来一切正常,但我的证书有问题。由于我的网站 (site.com) 有证书,所以相同的证书在 www.site.com 上不起作用,所以我所做的是购买另一个证书,它现在正在运行。
      猜你喜欢
      • 2017-11-05
      • 2020-04-28
      • 1970-01-01
      • 2018-02-04
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多