Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iis URL重定向失败_Iis_Asp.net Core_Url Redirection - Fatal编程技术网

Iis URL重定向失败

Iis URL重定向失败,iis,asp.net-core,url-redirection,Iis,Asp.net Core,Url Redirection,因此,情况简图: 我已经在asp.NETCore中创建了一个网站,我已经启动并运行了它。 几天前,我的托管提供商添加了配置SSL的选项,所以我这样做了,留下了一个问题,即没有从http重定向到https。 我已经开始在web上寻找解决方案,并找到了一些代码,这些代码在主机上的4种情况中的3种情况下有效,在IIS上本地测试的4种情况中的4种情况下有效 那么什么有效呢 ->无需重定向 ->重定向到 ->重定向到 ->给出重定向错误:错误\u太多\u重定向 asp.net核心站点中使用了以下代码:

因此,情况简图:

我已经在asp.NETCore中创建了一个网站,我已经启动并运行了它。 几天前,我的托管提供商添加了配置SSL的选项,所以我这样做了,留下了一个问题,即没有从http重定向到https。 我已经开始在web上寻找解决方案,并找到了一些代码,这些代码在主机上的4种情况中的3种情况下有效,在IIS上本地测试的4种情况中的4种情况下有效

那么什么有效呢

  • ->无需重定向
  • ->重定向到
  • ->重定向到
  • ->给出重定向错误:错误\u太多\u重定向
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);
        }
    }
}
public void配置(…){
app.UseHttpsWorldWideWebRedirect();
}
公共静态类HttpsWorldWideWebRedirectMiddlewareExtensions
{
公共静态IAApplicationBuilder UseHttpsWorldWideWebRedirect(此IAApplicationBuilder生成器)
{
返回builder.UseMiddleware();
}
}
公共类HttpSworldWideWebRedirect中间件
{
private readonly RequestDelegate\u next;
专用只读ILogger\u记录器;
公共HttpsWorldWideWebRedirectMiddleware(RequestDelegate下一步,ILogger记录器)
{
_下一个=下一个;
_记录器=记录器;
_logger.LogInformation(“加载Https WWW重定向模块”);
}
公共异步任务调用(HttpContext上下文)
{
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)
{
wait_next.Invoke(上下文);
}
其他的
{
var www=ignoreWww?”:“www.”;
新路径=
$“https://{www}{context.Request.Host.Value}{context.Request.PathBase}{context.Request.Path}{context.Request.QueryString}”;
_logger.LogDebug($“{context.Request.GetDisplayUrl()}”被重写为“{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>

作为结果url


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

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

var options = new RewriteOptions().AddRedirectToHttps();
app.UseRewriter(options);
如果您使用的是API,还可以在ConfigureServices()中将RequireHttpAttribute筛选器添加到MVC选项中:


我们只是在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>


我对.NET内核一无所知,但这当然可以通过URL重写规则来实现

您至少需要2条重写规则

  • 通过www将http请求重定向到https。
  • 将不带www.前缀的https请求重定向到带www.https
  • 这将尽可能减少重定向链


    
    
    我已经尝试了现有的中间件,问题仍然存在,这就是我首先创建自定义中间件的原因。此外,所述中间件在asp.net core中不工作,您需要重写包,然后可以使用app.AddRedirectToHttps();但是问题仍然是一样的,中间件不会重定向到www。正如我在我的情况中所说的,它会继续使用任何一段代码重定向。所以这不是问题我试过了,它给了我一个讨厌的重定向,等等…也不起作用,规则是好的,但它在相同的重定向上失败()@woutervs它是一个独立的解决方案,只适用于URL重写模块,所以它可能与您的中间件配置冲突。您可能需要删除行
    app.UseHttpsWorldWideWebRedirect()。我更新了关于条件
    localhost
    的答案。请尝试使用此新规则集。忘了提到我确实删除了中间件,更具体地说,我在启用和禁用中间件的情况下都尝试过。
    <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>