Подтвердить что ты не робот

Переписывание URL-адресов IIS7: как отказаться от протокола HTTPS от переписанного URL-адреса?

Я работаю на веб-сайте, который использует функцию перезаписи URL-адресов IIS 7, чтобы сделать постоянную переадресацию с example.com на www.example.com, а также переписывать схожих доменных имен на "главный", например от www.examples.com до www.example.com.

Это правило перезаписи - показано ниже - хорошо работает уже некоторое время. Тем не менее, мы недавно добавили поддержку HTTPS и заметили, что если пользователи перейдут на один из URL-адресов, которые будут переписаны на www.example.com, то HTTPS будет удален. Например, если пользователь посещает https://example.com, они перенаправляются на http://www.example.com, тогда как мы хотели бы, чтобы они были отправлены на https://www.example.com.

Здесь приведенное правило перезаписи (в Web.config):

<rule name="Canonical Host Name" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
        <add input="{HTTP_HOST}" pattern="^(www\.)?example\.net$" />
        <add input="{HTTP_HOST}" pattern="^(www\.)?example\.info$" />
        <add input="{HTTP_HOST}" pattern="^(www\.)?examples\.com$" />
    </conditions>

    <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

Как вы можете видеть, атрибут url элемента действия указывает прямо на http://, поэтому я понимаю, почему https://example.com перенаправляется http://www.example.com. Мой вопрос: как мне это исправить? Я попытался (наивно) просто отбросить часть http://из атрибута url, но это не сработало.

4b9b3361

Ответ 1

Придумал ответ с некоторой помощью моих коллег.

Мне нужно было использовать несколько правил с условием на {HTTPS}. Обратите внимание на условие {HTTPS} в приведенных ниже правилах.

<rule name="Canonical Host Name (HTTP)" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="OFF" />
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
    </conditions>

    <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

<rule name="Canonical Host Name (HTTPS)" stopProcessing="true">
    <match url="(.*)" />

    <conditions logicalGrouping="MatchAny">
        <add input="{HTTPS}" pattern="ON" />
        <add input="{HTTP_HOST}" pattern="^example\.com$" />
    </conditions>

    <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>

Затем я повторил пару правил выше для альтернативных имен доменов.

Ответ 2

Здесь Скотт отвечает с улучшениями Хасана. Это должно охватывать смешанные сайты SSL/non-SSL. В основном правило гласит: "Если у URL-адреса нет www.example.com", выполните постоянную переадресацию на него. По сути... вы перенаправляете людей, которые посещают вас без www или напрямую на ваш IP-адрес.

<rewrite>
<rules>
    <rule name="Canonical Host Name" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
        </conditions>
        <action type="Redirect" url="{MapSSL:{HTTPS}}www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
</rules>
<rewriteMaps>
    <rewriteMap name="MapSSL" defaultValue="http://">
        <add key="ON" value="https://" />
        <add key="OFF" value="http://" />
    </rewriteMap>
</rewriteMaps>
</rewrite>

Ответ 3

Если вы просто хотите перенаправить на основе используемого в настоящее время протокола (в соответствии с вашим последним образцом), там будет гораздо более простое решение, которое позволит вам сократить вдвое количество правил, которые вам понадобятся. Вот что я узнал из моего коллеги.

Как вы видели, аргумент {HTTPS} будет содержать значение ON или OFF. Вы можете сопоставить это значение с https://или http://, введя это значение в rewritemap.

Вот как это будет работать:

1- Создайте раздел rewritemap для сопоставления значения {HTTPS}:

    <rewriteMap name="MapProtocol" defaultValue="OFF">
      <add key="ON" value="https://" />
      <add key="OFF" value="http://" />
    </rewriteMap>

Вам решать, хотите ли вы включать только протокол, точку с запятой и прямую косую черту. Это не имеет значения для решения, но имейте это в виду, где бы вы ни ссылались на него.

2- Обратитесь к этой карте, где вам нужно. В этом примере он используется в исходящих правилах, но он также будет работать в вашем сценарии:

    <rule name="Outbound-Rule Name" stopProcessing="true" preCondition="ResponseIsHtml">
      <match filterByTags="A, Link, Script" pattern="YOUR PATTERN" />
      <action type="Rewrite" value="{MapProtocol:{HTTPS}}{HTTP_HOST}/REST OF RELATIVE LINK HERE" />
    </rule>

Чтобы он, модуль URL Rewrite теперь должен автоматически использовать правильный протокол для ваших ссылок в зависимости от того, используете ли вы https или, конечно же, http.

Надеюсь, это поможет!

Ответ 4

Здесь кросс-доменное решение, которое работает не только на example.com, но и на любой области

<rewrite>
    <rules>
        <rule name="Canonical Host Name" stopProcessing="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll">
                <add input="{HTTP_HOST}" pattern="^www\.([.a-zA-Z0-9]+)$" negate="true" />
            </conditions>
            <action type="Redirect" url="{MapProtocol:{HTTPS}}www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
        </rule>
    </rules>
    <rewriteMaps>
        <rewriteMap name="MapProtocol" defaultValue="OFF">
            <add key="ON" value="https://" />
            <add key="OFF" value="http://" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>