情况草图:
我已经在asp.net核心创建了一个网站,我已经开始运行了。 几天前,我的托管服务提供商添加了配置SSL的选项,所以我这样做让我遇到了没有从http重定向到https的问题。 我已经开始在网上寻找解决方案,并找出了一些代码,这些代码在主机上的4个案例中有3个有效,4个案例中有4个在IIS上进行本地测试。
那么有效:
以下代码用于asp.net核心站点:
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>
作为测试,我添加了&#34; iwork&#34;这一行:
结果仍然是错误的重定向错误,但后来用http://someurl.com/iworkiworkiworkiworkiworkiworkiworkiworkiworkiwork作为结果网址。
所以,我对于究竟出现了什么问题以及如何解决它的想法,任何想法感到茫然?
答案 0 :(得分:4)
对.NET Core一无所知,但这肯定可以通过URL重写规则来完成。
您至少需要2个重写规则。
这将尽可能减少重定向链。
<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>
答案 1 :(得分:2)
现有的中间件会自动为您处理重定向到HTTPS。只需在Startup类的Configure()方法顶部添加以下内容:
var options = new RewriteOptions().AddRedirectToHttps();
app.UseRewriter(options);
如果您正在使用API,您还可以在ConfigureServices()中的MVC选项中添加RequireHttpsAttribute过滤器:
services.AddMvc(mvcOptions =>
{
mvcOptions.Filters.Add(new RequireHttpsAttribute());
});
答案 2 :(得分:1)
我们在Azure配置中遇到了一些非常相似的问题,最后最好的方法是在web.config中使用重写模块,而不是尝试在代码中处理这个问题。
这与我们添加到服务器的内容非常接近,它应该适用于您的一些小编辑:
<system.webServer>
<rewrite>
<rules>
<rule name="Add WWW">
<match url="^(.*)$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?!www\.)(.*)$" />
</conditions>
<action type="Redirect" url="www.{C:0}{PATH_INFO}" redirectType="Permanent" />
</rule>
<rule name="Redirect to HTTPS">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
<add input="{URL}" pattern="/$" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="SeeOther" />
</rule>
</rules>
</rewrite>
</system.webServer>
以下是两个有用信息的网站:
https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/using-the-url-rewrite-module
http://blog.smarx.com/posts/redirecting-to-https-in-windows-azure-two-methods