如何在 ASP.NET Core 6 中停止 https 和 www 上的双重重定向?

How to stop double redirect on https and www in ASP.NET Core 6?

我在 web.config 中使用 IIS 重写规则来执行我的 HTTPS 和非 www 规范 URI 强制执行,但后来使用 Web 部署变得复杂,所以我切换到 ASP.NET Core 6 中间件。这是我来自 Program.cs:

的代码
app.UseRewriter(new RewriteOptions().AddRedirectToNonWwwPermanent());
app.UseHttpsRedirection();

对于http://example.com and https://www.example.com,效果很好,而且只有一个重定向。

但是,对于 http://www.example.com,它现在实施了非 www 规则,然后是 https 规则,因此您可以将两个 308 重定向链接在一起(对于 IIS,我只有一个重定向)。

你可以在这里测试:https://www.redirect-checker.org/index.php

输入:http://www.magazedia.com/

http://www.magazedia.com
308 Permanent Redirect
http://magazedia.com/
308 Permanent Redirect
https://magazedia.com/
200 OK

这对我的强迫症造成了严重破坏。

是否有简单的修复方法,或者我是否需要编写一个结合两者的自定义重定向?

编辑:

我也刚试过这个,但结果是一样的(双重重定向):

app.UseRewriter(new RewriteOptions().AddRedirectToNonWwwPermanent().AddRedirectToHttpsPermanent() );
// app.UseHttpsRedirection();

据我所知,asp.net核心url重写中间件也支持使用url重写规则xml.

您可以创建一个名为 IISUrlRewrite.xml 的 url reiwte xml,如下所示:

<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

然后修改startup.cs(.net 5)或program.cs(.net 6)

       using (StreamReader iisUrlRewriteStreamReader = 
            File.OpenText("IISUrlRewrite.xml")) 
        {
            var options = new RewriteOptions()
                .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            app.UseRewriter(options);
        }

更多的细节,你可以参考这个article