Asp.net mvc: как перенаправить не www на www и наоборот
Я хотел бы перенаправить весь трафик www на трафик, не связанный с www.
Я скопировал это в свой web.config
<system.webServer> / <rewrite> / <rules>
<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.domain\.com" />
</conditions>
<action type="Redirect" url="http://domain.com/{R:1}"
redirectType="Permanent" />
</rule>
за этот пост
Как перенаправить с помощью "www" URL без "www" URL или наоборот?
но я получил ошибку внутреннего внутреннего сервера.
Ответы
Ответ 1
Вы можете рассмотреть другой подход:
protected void Application_BeginRequest (object sender, EventArgs e)
{
if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
{
UriBuilder builder = new UriBuilder (Request.Url);
builder.Host = "www." + Request.Url.Host;
Response.Redirect (builder.ToString (), true);
}
}
Это, однако, сделает перенаправление 302, поэтому рекомендуется небольшая настройка:
protected void Application_BeginRequest (object sender, EventArgs e)
{
if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
{
UriBuilder builder = new UriBuilder (Request.Url);
builder.Host = "www." + Request.Url.Host;
Response.StatusCode = 301;
Response.AddHeader ("Location", builder.ToString ());
Response.End ();
}
}
Это будет возвращено 301 Перемещено навсегда.
Ответ 2
если вы скопировали его напрямую, тогда у вас есть некорректная разметка в файле web.config
вам нужно
<system.webServer>
<rewrite>
<rules>
<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.domain\.com" />
</conditions>
<action type="Redirect" url="http://domain.com/{R:1}"
redirectType="Permanent" />
</rule>
</rules>
</rewrite>
<system.webServer>
Строка, в которой говорится
<system.webServer> / <rewrite> / <rules>
заявляет, что вам нужно поместить конфигурацию в это место в вашем веб-сайте. Config.
<system.webServer>
является одним из конфигурационных файлов вашего файла web.Config.
EDIT:
Удостоверьтесь, что у вас установлен URL-адрес Rewrite для IIS7
На приведенной выше странице говорится о перенаправлении HTTP на HTTPS, но концепция по-прежнему применяется для WWW для WWW
Кроме того, вот несколько подробная информация о том, как все это происходит.
Ответ 3
**For a www to a non www Thanks @developerart**
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
{
UriBuilder builder = new UriBuilder(Request.Url);
builder.Host = Request.Url.Host.Replace("www.","");
Response.StatusCode = 301;
Response.AddHeader("Location", builder.ToString());
Response.End();
}
}
Ответ 4
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (!this.Request.Url.Host.StartsWith("www") && !this.Request.Url.IsLoopback)
{
var url = new UriBuilder(this.Request.Url);
url.Host = "www." + this.Request.Url.Host;
this.Response.RedirectPermanent(url.ToString(), endResponse: true);
}
}
Ответ 5
Основываясь на пользователе 151323 'ответ, вот полный ответ для пользователей Azure, которые также хотят запретить пользователям получать доступ к сайту из субдомена azurewebsites.net
(это входит в ваш Global.asax
внутри основного класса (MvcApplication
для Пользователи MVC)):
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Url.Host.StartsWith("YourSite.azurewebsites") && !Request.Url.IsLoopback)
{
Response.StatusCode = 301;
Response.AddHeader("Location", "www.YourSite.com");
Response.End();
return;
}
if (!Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
{
UriBuilder builder = new UriBuilder(Request.Url);
builder.Host = "www." + Request.Url.Host;
Response.StatusCode = 301;
Response.AddHeader("Location", builder.ToString());
Response.End();
}
}
Ответ 6
Я знаю, что эта ветка древняя и, кажется, ответила на смерть. Но может быть полезно обернуть каждое предложение global.asax с проверкой, работаете ли вы локально или нет. Таким образом, во время разработки с использованием IIS Express ваш сайт не будет пытаться перенаправлять на поддомену "www".
Что-то по линии:
protected void Application_BeginRequest(
object sender,
EventArgs e)
{
if (!Request.IsLocal)
{
// Do your check for naked domain here and do permanent redirect
}
}