Windows Azure的http重定向的最佳实践

时间:2010-06-21 02:26:49

标签: c# iis asp.net-mvc-2 web-config azure

我有一个名为

的天蓝网站
  • http://myapp.cloudapp.net

当然,此网址有点丑陋,因此我set up a CNAMEhttp://www.myapp.com指向天蓝色网址。

直到这里一直很好,但有一个障碍。

http://myapp.cloudapp.net已泄露出来,现在已被谷歌编入索引并存在于其他网站上。

我想将myapp.cloudapp.net的任何请求永久重定向到新家www.myapp.com

我所拥有的网站是用MVC.Net 2.0编写的,因为这是一个天蓝色的应用程序,没有用于访问IIS的UI,所有内容都需要在应用程序代码或web.config中完成。

设置永久重定向的简洁方法是什么,如果它放在web.config或全局控制器中?

2 个答案:

答案 0 :(得分:18)

您可能希望使用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>

答案 1 :(得分:5)

这就是我所做的:

我们有一个我们用于所有控制器的基本控制器类,我们现在覆盖:

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

    }
}

原因是我想要永久重定向(不是临时重定向),所以搜索引擎会纠正所有不良链接。