Как перенаправить HTTP на HTTPS в приложении MVC (IIS7.5) - PullRequest
50 голосов
/ 09 февраля 2011

Мне нужно перенаправить мой HTTP-сайт на HTTPS, добавлено ниже правило, но я получаю 403 Ошибка при попытке использования http://www.example.com,, он работает нормально, когда я набираю https://www.example.com в браузере

<system.webServer>
    <rewrite>
        <rules>
            <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                </conditions>
                <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Ответы [ 10 ]

110 голосов
/ 09 февраля 2011

Вы можете сделать это в коде:

Global.asax.cs

protected void Application_BeginRequest(){
    if (!Context.Request.IsSecureConnection)
        Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:"));
}

Или Вы можете добавить тот же код в фильтр действий:

public class SSLFilter : ActionFilterAttribute {

    public override void OnActionExecuting(ActionExecutingContext filterContext){
        if (!filterContext.HttpContext.Request.IsSecureConnection){
            var url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:");
            filterContext.Result = new RedirectResult(url);
        }
    }
}
42 голосов
/ 21 декабря 2016

В Global.asax.cs:

Простое перенаправление

protected void Application_BeginRequest()
{
    if (!Context.Request.IsSecureConnection
        && !Context.Request.IsLocal // to avoid switching to https when local testing
        )
    {
        // Only insert an "s" to the "http:", and avoid replacing wrongly http: in the url parameters
        Response.Redirect(Context.Request.Url.ToString().Insert(4, "s"));
    }
}

301 перенаправление: лучшие практики SEO (поисковая оптимизация)

Код ответа о состоянии перенаправления 301 Moved Permanently считается лучшей практикой для перехода пользователей с HTTP на HTTPS ( см. Рекомендации Google ).

Так что, если роботы Google или Bing тоже будут перенаправлены, учтите следующее:

protected void Application_BeginRequest()
{
    if (!Context.Request.IsSecureConnection
        && !Context.Request.IsLocal // to avoid switching to https when local testing
        )
    {
        Response.Clear();
        Response.Status = "301 Moved Permanently";
        Response.AddHeader("Location", Context.Request.Url.ToString().Insert(4, "s"));
        Response.End();
    }
}
7 голосов
/ 01 июля 2013

Я использую следующее в Global.asax:

protected void Application_BeginRequest()
{
  if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection)
  {
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}
2 голосов
/ 04 августа 2016

Вы можете использовать RequireHttpsAttribute для простых случаев.

[RequireHttps]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Как указано в MSDN ...

"Представляет атрибут, который заставляет незащищенный HTTP-запрос повторно отправляться по HTTPS."

RequireHttpsAttribute

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

2 голосов
/ 29 ноября 2015

Я сделал это таким образом, поскольку локальный сеанс отладки использует пользовательские номера портов:

    protected void Application_BeginRequest()
    {
        if (!Context.Request.IsSecureConnection)
        {
            if (HttpContext.Current.Request.IsLocal)
            {
                Response.Redirect(Context.Request.Url.ToString().Replace("http://localhost:25885/", "https://localhost:44300/"));
            }
            else
            {
                Response.Redirect(Context.Request.Url.ToString().Replace("http://", "https://"));
            }
        }
    }

Желательно, чтобы был какой-то способ получить URL-адрес и URL-адрес SSL программно ...

1 голос
/ 07 февраля 2019

У меня есть следующее правило перезаписи ASP.NET MVC в файле Web.config:

Вы можете попробовать этот код с файлом web.config.Если ваш URL-адрес http://www.example.com, он будет перенаправлен на этот URL-адрес https://www.example.com.

<system.webServer>
    <rewrite>
        <rules>
             <rule name="http to https" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
               <add input="{HTTPS}" pattern="^OFF$" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
1 голос
/ 06 ноября 2018

Для принудительной установки https только при запуске веб-сайта на сервере и игнорировании его при запуске веб-сайта на вашем компьютере для разработки:

В Global.asax:

Вам потребуетсяМетод Application_BeginRequest ()

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
         // .....
    }

    //force https on server, ignore it on local machine
    protected void Application_BeginRequest()
    {
        if (!Context.Request.IsSecureConnection && !Context.Request.Url.ToString().Contains("localhost"))
            Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:"));
    }
}
0 голосов
/ 23 мая 2019

Я не могу добавлять комментарии, но подумал, что эта дополнительная информация может кому-нибудь помочь.

Я реализовал идею Global.asax с помощью перманентного перенаправления 301 и добавил привязку http к сайту в IIS. Он по-прежнему давал мне 403 Запрещено, пока я не вспомнил, чтобы снять флажок «Требовать SSL» в настройках SSL.

0 голосов
/ 23 мая 2019

Этот ответ не совсем для OP, но для тех, кто не мог заставить его работать как я, и сталкивался с этим (и хотя я знаю, что в OP есть ошибка 403, а не 404), пожалуйста, обратитесь к этому ответу, если вы получаете 404 вместо: https://stackoverflow.com/a/6962829/5416602

Убедитесь, что у вас есть привязка для порта HTTP (80), а не только для порта HTTPS (443) в вашем IIS

0 голосов
/ 01 апреля 2019

Используйте этот код в файле web.config для перенаправления http: // to https://

 <configuration>
 <system.webServer>
 <rewrite>
 <rules>
 <rule name="HTTPS force" enabled="true" stopProcessing="true">
 <match url="(.*)" />
 <conditions>
 <add input="{HTTPS}" pattern="^OFF$" />
 </conditions>
 <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
 </rule>
 </rules>
 </rewrite>
 </system.webServer>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...