Рекомендации по перенаправлению http для Windows Azure - PullRequest
16 голосов
/ 21 июня 2010

У меня есть лазурный веб-сайт с именем:

Конечно, этот URL довольно уродлив, поэтому я настроилCNAME , который указывает http://www.myapp.com на лазурный URL.

Пока все хорошо, но есть загвоздка.

http://myapp.cloudapp.net просочился и теперь индексируется Google и живет на других сайтах.

Я бы хотел перенаправить любые запросы на myapp.cloudapp.net в новый дом по адресу www.myapp.com

Мой веб-сайт закодирован в MVC.Net 2.0, так какявляется лазурным приложением, для доступа к IIS пользовательский интерфейс отсутствует, и все должно быть сделано в коде приложения или в файле web.config.

Как правильно установить постоянное перенаправление на месте, должно ли оно идти в web.config или в глобальном контроллере?

Ответы [ 2 ]

18 голосов
/ 21 июня 2010

Возможно, вы захотите вместо этого использовать модуль перезаписи 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>
5 голосов
/ 21 июня 2010

Вот что я сделал:

У нас есть базовый класс контроллеров, который мы используем для всех наших контроллеров, теперь мы переопределяем:

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

    }
}

Причина в том, что я хочу постоянное перенаправление (а не временное), чтобы поисковые системы исправляли все плохие ссылки.

...