Перенаправить на https без www, пропустив localhost - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь настроить правила перезаписи в Asp. Net проекте.

Перезапись на https и удаление любых "www." в настоящее время работает в производстве, но когда я пытаюсь запустить его на localhost, он продолжает перенаправлять его на https.

Это сайт Umbraco, работающий на Azure. Вот почему первое правило существует.

Вот как оно выглядит в настоящее время: у меня есть и правило, и два условия, пытающиеся пропустить перенаправление localhost, но ни одно из них не работает.

<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>

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Я выяснил это с помощью одного из этих онлайн-инструментов регулярных выражений, чтобы проверить, соответствует ли "^localhost$" моему локальному URL.

И оказалось, что это не так.

Изменение регулярного выражения на простое "(localhost:)" исправило его.

Я также удалил второе правило, включив в него только localhost, потому что оно не выполнялось что-нибудь, и случайно "Удалить www" URL 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>
0 голосов
/ 13 февраля 2020
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;
    }
}
...