gpt4 book ai didi

iis - URL 重定向失败

转载 作者:行者123 更新时间:2023-12-04 14:40:42 26 4
gpt4 key购买 nike

所以情况简图:

我已经在 asp.net core 中创建了一个网站,我已经启动并运行了它。几天前,我的托管服务提供商添加了配置 SSL 的选项,所以我这样做让我遇到了没有从 http 重定向到 https 的问题。我已经开始在网上寻找解决方案,并找到了一些代码,这些代码适用于 4 个托管案例中的 3 个以及 4 个案例中的 4 个在 IIS 上进行本地测试。

那么什么有效:

在asp.net core站点中使用了以下代码:

public void Configure(...) {
app.UseHttpsWorldWideWebRedirect();
}

public static class HttpsWorldWideWebRedirectMiddlewareExtensions
{
public static IApplicationBuilder UseHttpsWorldWideWebRedirect(this IApplicationBuilder builder)
{
return builder.UseMiddleware<HttpsWorldWideWebRedirectMiddleware>();
}
}

public class HttpsWorldWideWebRedirectMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<HttpsWorldWideWebRedirectMiddleware> _logger;

public HttpsWorldWideWebRedirectMiddleware(RequestDelegate next, ILogger<HttpsWorldWideWebRedirectMiddleware> logger)
{
_next = next;
_logger = logger;
_logger.LogInformation("Https WWW redirect module loaded");
}

public async Task Invoke(HttpContext context)
{
var protoHeader = context.Request.Headers["X-Forwarded-Proto"].ToString();
var ignoreHttps = false;
var ignoreWww = false;

if (context.Request.IsHttps || protoHeader.ToLower().Equals("https"))

{
ignoreHttps = true;
}

if (context.Request.Host.Host.StartsWith("www", StringComparison.OrdinalIgnoreCase) || string.Equals(context.Request.Host.Host, "localhost", StringComparison.OrdinalIgnoreCase))
{
ignoreWww = true;
}

if (ignoreWww && ignoreHttps)
{
await _next.Invoke(context);
}
else
{
var www = ignoreWww ? "" : "www.";
var newPath =
$"https://{www}{context.Request.Host.Value}{context.Request.PathBase}{context.Request.Path}{context.Request.QueryString}";
_logger.LogDebug($"'{context.Request.GetDisplayUrl()}' was rewritten into '{newPath}'");
context.Response.Headers["X-Forwarded-Proto"] = "https";
context.Response.Redirect(newPath, true);
}
}
}

我尝试的下一步是在 web.config 中添加重定向,以涵盖使用以下代码的 asp.net 重定向不起作用的情况:

<rewrite>
<rules>
<rule name="Redirect to https if http://www" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^www.*"/>
<add input="{HTTPS}" pattern="Off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>

作为测试,我在这一行添加了“iwork”:

结果仍然是错误的重定向太多但随后使用 http://someurl.com/iworkiworkiworkiworkiworkiworkiworkiworkiworkiwork作为结果网址。

所以我不知道到底出了什么问题,也不知道如何解决它,有什么想法吗?

最佳答案

对 .NET Core 一无所知,但这当然可以通过 URL 重写规则来完成。

您至少需要 2 个重写规则。

  1. 将 http 请求重定向到 https with www.
  2. 重定向没有 www 的 https 请求。 https 前缀为 www.

这将尽可能减少重定向链。


<rewrite>
<rules>
<rule name="Redirect all http requests to https with www" stopProcessing="true">
<match url=".*" />
<conditions trackAllCaptures="true">
<add input="{HTTP_HOST}" pattern="^localhost" negate="true" />
<add input="{HTTPS}" pattern="off" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)$" />
</conditions>
<action type="Redirect" url="https://www.{C:1}/{R:0}" />
</rule>
<rule name="Redirect https requests with no www prefix to https with www" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost" negate="true" />
<add input="{HTTPS}" pattern="on" />
<add input="{HTTP_HOST}" pattern="^www\." negate="true" />
</conditions>
<action type="Redirect" url="https://www.{HTTP_HOST}/{R:0}" />
</rule>
</rules>
</rewrite>

关于iis - URL 重定向失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44285669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com