Ответ 1
Я использую следующее в Global.asax:
protected void Application_BeginRequest()
{
if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection)
{
Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
}
}
Мне нужно перенаправить свой 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>
Я использую следующее в Global.asax:
protected void Application_BeginRequest()
{
if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection)
{
Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
}
}
Вы можете сделать это в коде:
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);
}
}
}
В 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();
}
}
В этой статье очень хорошо объясняется, как перенаправить все запросы на HTTPS.
Я сделал это, потому что в локальном сеансе отладки используются пользовательские номера портов:
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 программным путем...
Вы можете использовать RequireHttpsAttribute для простых случаев.
[RequireHttps]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Как указано в MSDN...
"Представляет атрибут, который заставляет необеспеченный HTTP-запрос пересылается через HTTPS."
Я не уверен, что вы захотите использовать это для обеспечения HTTPS на большом сайте. Много украшений, чтобы сделать, и возможность пропустить контроллеры.
Принудительно использовать 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:"));
}
}
У меня есть следующее правило перезаписи 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>
Используйте этот код в файле 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>
Этот ответ не совсем для OP, но для тех, кто не мог заставить его работать как я, и сталкивался с этим (и хотя я знаю, что в OP есть ошибка 403, а не 404), пожалуйста, обратитесь к этому ответу, если вы получаете 404 вместо этого: fooobar.com/questions/3866518/...
Убедитесь, что в вашем IIS есть привязка для порта HTTP (80), а не только для порта HTTPS (443)
Я не могу добавлять комментарии, но подумал, что эта дополнительная информация может кому-то помочь.
Я реализовал идею Global.asax с помощью перманентного перенаправления 301 и добавил http-привязку к сайту в IIS. Это по-прежнему давало мне 403 Запрещено, пока я не вспомнил, чтобы снять флажок "Требовать SSL" в настройках SSL.