首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >URL重定向失败

URL重定向失败
EN

Stack Overflow用户
提问于 2017-05-31 13:06:16
回答 3查看 678关注 0票数 3

所以情况简介:

我用asp.net核心创建了一个网站,我已经启动并运行了它。几天前,我的主机提供商增加了配置SSL的选项,所以我就这样做了,这给我留下了一个问题,就是不能从http重定向到https。我已经开始在网络上寻找解决方案,并找出了一些代码,这些代码适用于主机上的4种情况中的3种,以及在IIS上本地测试的4种情况中的4种。

那么,什么是有效的:

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

代码语言:javascript
复制
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重定向不起作用的情况:

代码语言:javascript
复制
<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作为结果url。

所以我对到底出了什么问题而不知所措,不知道如何解决这个问题,有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2017-06-10 21:37:39

不知道任何关于.NET核心,但这肯定可以用重写规则。

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

  1. 使用www.将http请求重定向到https
  2. 没有www重定向https请求。带有www.的https前缀

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

代码语言:javascript
复制
<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>
票数 4
EN

Stack Overflow用户

发布于 2017-05-31 16:56:12

现有的中间件将自动为您处理重定向到HTTPS的问题。只需在Startup类中配置()方法的顶部添加以下内容:

代码语言:javascript
复制
var options = new RewriteOptions().AddRedirectToHttps();
app.UseRewriter(options);

如果您使用的是API,您还可以在RequireHttpsAttribute ()中为您的MVC选项添加一个ConfigureServices过滤器:

代码语言:javascript
复制
services.AddMvc(mvcOptions => 
        {
            mvcOptions.Filters.Add(new RequireHttpsAttribute());

        });
票数 2
EN

Stack Overflow用户

发布于 2017-06-10 20:56:50

我们只是在Azure配置中遇到了类似的情况,最后最好的方法是在web.config中使用重写模块,而不是在代码中尝试处理这个问题。

这与我们添加到服务器中的内容非常接近,它应该可以对您进行一些小编辑:

代码语言:javascript
复制
<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://learn.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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44285669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档