Как перенаправить HTTP на HTTPS в приложение MVC (IIS7.5)

Мне нужно перенаправить свой 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>

Ответ 1

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

protected void Application_BeginRequest()
{
  if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection)
  {
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}

Ответ 2

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

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);
        }
    }
}

Ответ 3

В 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 переадресацию 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();
    }
}

Ответ 4

В этой статье очень хорошо объясняется, как перенаправить все запросы на HTTPS.

Ответ 5

Я сделал это, потому что в локальном сеансе отладки используются пользовательские номера портов:

    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 программным путем...

Ответ 6

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

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

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

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

RequireHttpsAttribute

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

Ответ 7

Принудительно использовать 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:"));
    }
}

Ответ 8

У меня есть следующее правило перезаписи 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>

Ответ 9

Используйте этот код в файле web.config для перенаправления http://на 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>

Ответ 10

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

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

Ответ 11

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

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