Как заставить HTTPS использовать файл web.config - PullRequest
195 голосов
/ 22 марта 2012

Я искал в 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 для всех ресурсов сайта.

Ответы [ 8 ]

390 голосов
/ 22 марта 2012

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

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

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

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

75 голосов
/ 18 марта 2015

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

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

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

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

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

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

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Использовать 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));
    
  5. Включите схему https в любой используемый URL-адрес. Политика безопасности контента (CSP) HTTP-заголовок и Субресурсная целостность (SRI) не работают хорошо, когда вы подражаете схеме в некоторых браузерах.Лучше быть явно о HTTPS.например,

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

11 голосов
/ 11 января 2017

Чтобы дополнить ответ 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 удаляет все серверные правила, которые мы могли бы наследовать в противном случае.
  • rule определяет правило.
    • name произвольное (хотя и уникальное) имя для правила.
    • stopProcessing следует ли направить запрос немедленно в конвейер запросов IIS или сначала обработать дополнительные правила.
  • соответствует при запуске этого правила.
    • url шаблон для сравнения URL
  • условия дополнительные условия о том, когда выполнять это правило;условия обрабатываются только при первом совпадении.
    • логическая группировка независимо от того, должны ли быть выполнены все условия (MatchAll), или должно быть выполнено любое из условий (MatchAny);похож на И против ИЛИ.
  • add добавляет условие, которое должно быть выполнено.
    • вход вход, который оценивает условие;входные данные могут быть переменными сервера.
    • шаблон стандарт, по которому оценивается ввод.
    • ignoreCase независимо от того, имеет ли значение заглавная буква или нет.
  • action что делать, если match и conditions все верны.
    • тип обычно может быть 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 голосов
/ 05 апреля 2017

Принятый ответ не работает для меня.Я следовал инструкциям в этом блоге .

. Ключевым моментом, который мне не хватало, было то, что мне нужно было загрузить и установить инструмент перезаписи URL для 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>
1 голос
/ 03 апреля 2018

В .Net Core следуйте инструкциям на https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

. В файле startup.cs добавьте следующее:

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

Чтобы перенаправить Http в Https, добавьте следующее вstartup.cs

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);
0 голосов
/ 27 июня 2017

Мне не разрешили установить 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>

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

0 голосов
/ 06 июля 2016

Превосходная библиотека 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>
0 голосов
/ 16 марта 2015

A простой способ состоит в том, чтобы сообщить 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...