Лучшая практика перенаправления HTTP для Windows Azure
У меня есть лазурный сайт, который называется:
-
http://myapp.cloudapp.net
Конечно, этот URL-адрес уродлив, поэтому я настроил CNAME, который указывает http://www.myapp.com
на лазурный url.
Все хорошо, пока здесь, но есть загвоздка.
http://myapp.cloudapp.net
просочился и теперь индексируется google и живет на других сайтах.
Я хотел бы навсегда перенаправить любые запросы на myapp.cloudapp.net в новый дом на www.myapp.com
Веб-сайт, который у меня есть, закодирован в MVC.Net 2.0, так как это приложение azure, не существует интерфейса для доступа к IIS, и все должно быть сделано в коде приложения или web.config.
Что такое чистый способ установки постоянной переадресации на место, должен ли он работать в web.config или в глобальном контроллере?
Ответы
Ответ 1
Вместо этого вы можете использовать модуль перезаписи IIS (кажется, "чище" ). Вот сообщение в блоге, в котором показано, как это сделать: http://weblogs.asp.net/owscott/archive/2009/11/30/iis-url-rewrite-redirect-multiple-domain-names-to-one.aspx. (Вам просто нужно поместить соответствующую разметку в web.config.)
Примерное правило, которое вы можете использовать:
<rule name="cloudexchange" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="cloudexchange.cloudapp.net" />
</conditions>
<action type="Redirect" url="http://odata.stackexchange.com/{R:0}" />
</rule>
Ответ 2
Это то, что я сделал:
У нас есть класс базового контроллера, который мы используем для всех наших контроллеров, теперь мы переопределяем:
protected override void OnActionExecuted(ActionExecutedContext filterContext) {
var host = filterContext.HttpContext.Request.Headers["Host"];
if (host != null && host.StartsWith("cloudexchange.cloudapp.net")) {
filterContext.Result = new RedirectPermanentResult("http://odata.stackexchange.com" + filterContext.HttpContext.Request.RawUrl);
} else
{
base.OnActionExecuted(filterContext);
}
}
И добавил следующий класс:
namespace StackExchange.DataExplorer.Helpers
{
public class RedirectPermanentResult : ActionResult {
public RedirectPermanentResult(string url) {
if (String.IsNullOrEmpty(url)) {
throw new ArgumentException("url should not be empty");
}
Url = url;
}
public string Url {
get;
private set;
}
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
if (context.IsChildAction) {
throw new InvalidOperationException("You can not redirect in child actions");
}
string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
context.Controller.TempData.Keep();
context.HttpContext.Response.RedirectPermanent(destinationUrl, false /* endResponse */);
}
}
}
Мы полагаем, что я хочу постоянную переадресацию (а не временную), чтобы поисковые системы исправляли все плохие ссылки.