Переписать URL, чтобы удалить www и перенаправить на https с помощью web-config (c# .net)

У меня есть следующий код в моей веб-конфигурации, чтобы иметь возможность перенаправлять как URL-адреса с префиксом «www», так и запросы без SSL на https://mydomain.com, потому что сертификат SSL зарегистрирован в домене без www

<rewrite>
  <rules>
    <rule name="Remove WWW prefix and redirect to https" >
      <match url="(.*)" ignoreCase="true" />
      <conditions logicalGrouping="MatchAny">
        <add input="{HTTP_HOST}" pattern="^(www\.)(.*)$" ignoreCase="true" />
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" redirectType="Permanent" url="https://mydomain.com/{R:1}" />
    </rule>
  </rules>
</rewrite>

Вот результат:

1) http://mydomain.com/something --> https://mydomain.com/something (правильно)

2) http://www.mydomain.com/something --> https://mydomain.com/something (правильно)

3) https://www.mydomain.com/something --> Показывает ошибку сертификата (Существует проблема с сертификатом безопасности этого веб-сайта.)

Когда вы выбираете «Продолжить на этом веб-сайте (не рекомендуется)». на странице ошибки сертификата URL-адрес переписан правильно (https://mydomain.com/something)

Как я могу убедиться, что ошибка сертификата не отображается?

Спасибо


person The Serious Game Programmer    schedule 25.04.2014    source источник


Ответы (5)


Один из способов решить эту проблему — зарегистрировать два отдельных правила:

  1. Удалить www.
  2. Принудительно HTTPS.

    <rule name="Remove www" stopProcessing="true">
      <match url="(.*)" negate="false"></match>
      <conditions>
        <add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
      </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="{HTTPS}" pattern="off" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
    </rule>
    
person Robertas    schedule 30.03.2017

поэтому мы используем это в наших проектах, и это работает.

Дайте мне знать, что помогает:

<rewrite>
  <rules>
    <rule name="Redirect to https">
      <match url="(.*)"/>
      <conditions>
        <add input="{HTTPS}" pattern="Off"/>
        <add input="{REQUEST_METHOD}" pattern="^get$|^head$" />
        <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/>
    </rule>
  </rules>
</rewrite>

Он также игнорирует запрос при доступе к сайту на вашем локальном компьютере.

person Del    schedule 10.10.2014
comment
Это не удаляет www. - person empz; 03.09.2015

Я не уверен в этом, так как у меня нет большого опыта в переписывании URL-адресов, но попытка помочь не повредит.
Вы можете попробовать это

<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://mydomain.com/{R:1}" redirectType="Permanent" />

Я довольно много гуглил и нашел это, но это может не сработать, что вы хотели.

person Matan    schedule 25.04.2014
comment
Спасибо, но, к сожалению, это имело тот же результат. - person The Serious Game Programmer; 25.04.2014

Эту проблему нельзя решить с помощью правил перезаписи: проблема в том, что сертификат проверяется в момент установки соединения с сервером. Поскольку на вашем сервере нет действительного сертификата для варианта www., сертификат недействителен, и браузер уведомит об этом пользователя.

Только после того, как пользователь соглашается продолжить, запрос отправляется на сервер и вступают в силу правила перезаписи.

person Wiebe Cnossen    schedule 07.03.2018

Я вижу ту же проблему. Поскольку у домена нет SSL-сертификата для www, код web.config не удаляет www, если URL-адрес включает https. В результате используется http с www или без него, правильно перенаправляет его на https://domain, но если он начинается с https: и www, он зависает.

Так можно ли разрешить это на уровне DNS, чтобы www не определялся как CNAME и просто перенаправлялся туда? Google Domains, кажется, имеет синтетические записи для этого. Кто-нибудь использовал его успешно?

person LukeChung-FMS    schedule 09.12.2020