Как заставить example.com перенаправляться на www.example.com с переписыванием URL-адресов в IIS7? Какое правило должно войти в web.config? Спасибо.
Переписывание URL-адреса IIS7 - добавление префикса "www"
Ответ 1
Это образец Microsoft для URL Rewrite Module 2.0, который перенаправляет *.fabrikam.com на www.fabrikam.com
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Add www" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTP_HOST}" pattern="www.fabrikam.com" negate="true" />
</conditions>
<action type="Redirect" url="http://www.fabrikam.com/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Ответ 2
Чтобы сделать его более универсальным, вы можете использовать следующее правило Rewrite URL, которое работает в любом домене:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Add WWW" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?!www\.)(.*)$" />
</conditions>
<action type="Redirect" url="http://www.{C:0}{PATH_INFO}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
Ответ 3
Не уверен относительно наилучшего способа сделать это, но у меня есть сайт со всеми старыми доменами/поддоменами, которые запускают этот web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Transfer" stopProcessing="true">
<match url=".*" />
<action type="Redirect" url="http://www.targetsite.com/{R:0}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Кажется, нужно выполнить задание.
Ответ 4
Я не уверен, помогает ли это, но я решил сделать это на уровне приложения. Вот фильтр быстрого действия, который я написал, чтобы сделать это. Просто добавьте класс где-то в свой проект, а затем вы можете добавить [RequiresWwww] к одному действию или всему контроллеру.
public class RequiresWww : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase req = filterContext.HttpContext.Request;
HttpResponseBase res = filterContext.HttpContext.Response;
//IsLocal and IsLoopback i'm not too sure on the differences here, but I have both to eliminate local dev conditions.
if (!req.IsLocal && !req.Url.Host.StartsWith("www") && !req.Url.IsLoopback)
{
var builder = new UriBuilder(req.Url)
{
Host = "www." + req.Url.Host
};
res.Redirect(builder.Uri.ToString());
}
base.OnActionExecuting(filterContext);
}
}
Тогда
[RequiresWwww]
public ActionResult AGreatAction()
{
...
}
или
[RequiresWwww]
public class HomeController : BaseAppController
{
..
..
}
Надеюсь, что это поможет кому-то. Ура!