Как заставить HTTPS использовать файл web.config

Я искал вокруг Google и StackOverflow, пытаясь найти решение для этого, но все они, похоже, относятся к ASP.NET и т.д.

Я обычно запускаю Linux на своих серверах, но для этого одного клиента я использую Windows с IIS 7.5 (и Plesk 10). Именно по этой причине я немного не знаком с файлами IIS и web.config. В файле .htaccess вы можете использовать условия перезаписи для определения того, является ли протокол HTTPS и перенаправлен соответствующим образом. Есть ли простой способ для этого, используя файл web.config, или даже используя модуль URL Rewrite ', который я установил?

У меня нет опыта работы с ASP.NET, поэтому, если это задействовано в решении, добавьте четкие инструкции по его реализации.

Причина, по которой я делаю это с помощью web.config и не PHP, это то, что я хотел бы заставить HTTPS использовать все ресурсы на сайте.

Ответ 1

Вам нужен модуль URL Rewrite, желательно v2 (у меня нет v1, поэтому я не могу гарантировать, что он будет работать там, но он должен).

Вот пример такого web.config - он заставит HTTPS для ВСЕХ ресурсов (используя 301 Постоянный переадресация):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

P.S. Это конкретное решение не имеет ничего общего с ASP.NET/PHP или любой другой технологией, как это было сделано с использованием модуля перезаписи URL-адресов - он обрабатывается на одном из начальных/нижних уровней - до того, как запрос дойдет до точки, в которой ваш код получает выполняется.

Ответ 2

Для тех, кто использует ASP.NET MVC. Вы можете использовать RequireHttpsAttribute, чтобы все ответы были HTTPS:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

Другие вещи, которые вы также можете сделать, чтобы защитить ваш сайт:

  • Принудительные маркеры Anti-Forgery использовать SSL/TLS:

    AntiForgeryConfig.RequireSsl = true;
    
  • Требовать, чтобы Cookies требовали HTTPS по умолчанию, изменив файл Web.config:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  • Используйте пакет NWebSec.Owin NuGet и добавьте следующую строку кода, чтобы включить Strict Transport Security (HSTS) по всему сайту. Не забудьте добавить директиву Preload ниже и отправить свой сайт на сайт здесь и здесь. Обратите внимание: если вы не используете OWIN, существует метод Web.config, который вы можете прочитать на NWebSec.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  • Используйте пакет NWebSec.Owin NuGet и добавьте следующую строку кода, чтобы включить шифрование открытого ключа (HPKP) на сайте. Подробнее здесь и здесь.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
    
  • Включите схему https в любом используемом URL. Политика безопасности содержимого (CSP) Заголовок HTTP и Целостность субресурсов (SRI) Не играйте хорошо, когда вы имитируете схему в некоторых браузерах. Лучше говорить о HTTPS. например.

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  • Используйте ASP.NET MVC Boilerplate Шаблон проекта Visual Studio для создания проекта со всем этим и гораздо более встроенным. Вы также можете просмотреть код на GitHub.

Ответ 3

Чтобы увеличить ответ LazyOne, вот аннотированная версия ответа.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action 
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>

Очистите все другие правила, которые уже были определены на этом сервере. Создайте новое правило, которое мы назовем "Перенаправить все запросы на https". После обработки этого правила не обрабатывайте больше правил! Сопоставьте все входящие URL-адреса. Затем проверьте, соблюдены ли все эти условия: HTTPS выключен. Ну, это только одно условие (но убедитесь, что это правда). Если это так, отправьте 301 Постоянное перенаправление обратно клиенту на http://www.foobar.com/whatever?else=the#url-contains. Не добавляйте строку запроса в конце этого, потому что она будет дублировать строку запроса!

Это то, что означают свойства, атрибуты и некоторые значения.

  • clear удаляет все правила сервера, которые мы могли бы наследовать.
  • правило определяет правило.
    • name произвольное (хотя и уникальное) имя для правила.
    • stopProcessing следует ли перенаправить запрос непосредственно в конвейер запросов IIS или сначала обработать дополнительные правила.
  • сопоставить при запуске этого правила.
    • url шаблон, по которому можно оценить URL
  • условия дополнительные условия о том, когда запускать это правило; условия обрабатываются только в том случае, если есть первое совпадение.
    • logicalGrouping должны ли выполняться все условия (MatchAll), или любое из условий должно быть истинным (MatchAny); аналогично И против ИЛИ.
  • добавить добавляет условие, которое должно выполняться.
    • input ввод, который оценивает условие; входные данные могут быть переменными сервера.
    • шаблон стандарт, по которому можно оценить ввод.
    • ignoreCase имеет значение капитализация или нет.
  • action, что делать, если все match и его conditions все true.
    • тип обычно может быть redirect (на стороне клиента) или rewrite (на стороне сервера).
    • url, что нужно создать в результате этого правила; в этом случае объедините https:// с двумя переменными сервера.
    • redirectType, который перенаправляет HTTP; это 301 Постоянный.
    • appendQueryString добавить ли строку запроса в конец результирующего url или нет; в этом случае мы устанавливаем его в false, потому что {REQUEST_URI} уже включает его.

Переменные сервера

  • {HTTPS}, который является либо OFF, либо ON.
  • {HTTP_HOST} - www.mysite.com и
  • {REQUEST_URI} включает в себя остальную часть URI, например. /home?key=value
    • браузер обрабатывает #fragment (см. комментарий от LazyOne).

Смотрите также: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

Ответ 4

Отличная библиотека NWebsec может обновлять ваши запросы от HTTP до HTTPS с помощью тега upgrade-insecure-requests в Web.config:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

Ответ 5

Принятый ответ не помог мне. Я выполнил шаги на этом blog.

Ключевым моментом, который мне не хватало, было то, что мне нужно было загрузить и установить URL Rewrite Tool для IIS. Я нашел здесь. В результате получилось следующее.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>

Ответ 6

Мне не разрешили устанавливать URL Rewrite в моей среде.

Итак, я нашел другой путь.

Добавление этого в мой web.config добавило ошибку перезаписи и работало на IIS 7.5

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

Затем, следуя советам здесь: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Я создал html файл, который выполняет перенаправление (redirectToHttps.html):

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

Я надеюсь, что кто-то найдет это полезным, поскольку я не мог найти все части в одном месте в другом месте.

Ответ 7

Простым способом является передача IIS для отправки настраиваемого файла ошибок для HTTP-запросов. Затем файл может содержать мета-перенаправление, перенаправление JavaScript и инструкции со ссылкой и т.д. Важно отметить, что вы по-прежнему можете проверить "Требовать SSL" для сайта (или папки), и это будет работать.

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>