Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best practice for http redirection for Windows Azure

I have an azure website which is named:

  • http://myapp.cloudapp.net

Of-course this URL is kind of ugly so I set up a CNAME that points http://www.myapp.com to the azure url.

All is well up until here, but there is a snag.

http://myapp.cloudapp.net has leaked out and now is indexed by google and lives on other sites.

I would like to permanently redirect any requests for myapp.cloudapp.net to the new home at www.myapp.com

The website I have is coded in MVC.Net 2.0, as this is an azure app, there is not UI to access IIS and everything needs to be done in application code or web.config.

What is a clean way to set a permanent redirect in place, should it go in web.config or in a global controller?

like image 637
Sam Saffron Avatar asked Jun 21 '10 02:06

Sam Saffron


2 Answers

You might want to instead use the IIS rewrite module (seems "cleaner"). Here's a blog post that shows how to do this: http://weblogs.asp.net/owscott/archive/2009/11/30/iis-url-rewrite-redirect-multiple-domain-names-to-one.aspx. (You'll just need to put the relevant markup in web.config.)

An example rule you could use is:

    <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>
like image 150
user94559 Avatar answered Nov 13 '22 15:11

user94559


This is what I did:

We have a base controller class we use for all our controllers, we now override:

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

And added the following class:

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

    }
}

The reasoning is that I want a permanent redirect (not a temporary one) so the search engines correct all the bad links.

like image 29
Sam Saffron Avatar answered Nov 13 '22 16:11

Sam Saffron