跳转到没有 www 的 https,同时跳过 localhost

Redirect to https without www, while skipping localhost

我正在尝试在 Asp.Net 项目中设置重写规则。

重写到 https 并删除任何 "www." 目前在生产中有效,但是当我尝试在本地主机上 运行 它时,它一直将它重定向到 https。

它是 运行在 Azure 上的一个 Umbraco 站点。这就是第一条规则存在的原因。

这是目前的样子: 我有一个规则和两个条件试图跳过本地主机的重定向,但它们都不起作用。

<system.webServer>    
<rewrite>
  <rules>
    <rule name="AlwaysOn agent requests without any redirections" stopProcessing="true">
      <match url="^$"/>
      <conditions>
        <add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$"/>
      </conditions>
      <action type="None"/>
    </rule>
    <rule name="Skip it all, if on localhost" stopProcessing="true">
      <match url="^localhost$"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="^localhost$"/>
      </conditions>
      <action type="None"/>
    </rule>
    <rule name="Remove www" stopProcessing="true">
      <match url="(.*)"></match>
      <conditions>
        <add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
        <add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost$" negate="true" />
      </conditions>
      <action type="Redirect" url="https://{C:1}/{R:1}" appendQueryString="true" redirectType="Permanent" />
    </rule>
    <rule name="Force HTTPS" enabled="true">
      <match url="(.*)" ignoreCase="false" />
      <conditions>
        <add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost$" negate="true" />
        <add input="{HTTPS}" pattern="off" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>
</system.webServer>
void Application_BeginRequest(Object sender, EventArgs e)
{
    if (HttpContext.Current.Request.IsLocal)
        return;

    if (!Request.IsSecureConnection)//always https!!!
    {
        var _nfn = "https://" + (Request.Url.Host + Request.RawUrl).ToLowerInvariant();
        Response.RedirectPermanent(_nfn);
        return;
    }
}

我想通了,通过使用其中一种在线正则表达式工具,看看“^localhost$”是否匹配我的本地主机 url。

事实证明它没有。

将正则表达式更改为简单的“(localhost:)”修复了它。

我还删除了第二条规则,其中只有 localhost,因为它没有做任何事情,并且有机会 "Remove www" 匹配 url abit。

这是我最终得到的结果:

<system.webServer>    
  <rewrite>
      <rules>
        <rule name="AlwaysOn agent requests without any redirections" stopProcessing="true">
          <match url="^$"/>
          <conditions>
            <add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$"/>
          </conditions>
          <action type="None"/>
        </rule>
        <rule name="Remove www" stopProcessing="true">
          <match url="(.*)\/\/www\.(.*)$"></match>
          <conditions>
            <add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
          </conditions>
          <action type="Redirect" url="https://{C:2}/{R:1}" appendQueryString="true" redirectType="Permanent" />
        </rule>
      <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
        <match url="^(.*)$"/>
        <conditions>
          <add input="{HTTPS}" pattern="^OFF$"/>
          <add input="{HTTP_HOST}" matchType="Pattern" pattern="(localhost:)" negate="true" /> 
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent"/>
      </rule>
      </rules>
    </rewrite>
</system.webServer>