c# - microsoft - postal azure
Prácticas recomendadas para la redirección de http para Windows Azure (2)
Es posible que desee utilizar el módulo de reescritura de IIS (que parece "más limpio"). Aquí hay una publicación de blog que muestra cómo hacer esto: http://weblogs.asp.net/owscott/archive/2009/11/30/iis-url-rewrite-redirect-multiple-domain-names-to-one.aspx . (Solo deberás poner el marcado correspondiente en web.config).
Una regla de ejemplo que podrías usar es:
<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>
Tengo un sitio web azul que se llama:
http://myapp.cloudapp.net
Por supuesto, esta URL es un poco fea, así que configuré un CNAME que apunta a http://www.myapp.com
a la URL azul.
Todo está bien hasta aquí, pero hay un inconveniente.
http://myapp.cloudapp.net
ha filtrado y ahora está indexado por Google y vive en otros sitios.
Me gustaría redirigir permanentemente cualquier solicitud de myapp.cloudapp.net a la nueva casa en www.myapp.com
El sitio web que tengo está codificado en MVC.Net 2.0, ya que esta es una aplicación azure, no hay una interfaz de usuario para acceder a IIS y todo debe hacerse en el código de la aplicación o web.config.
¿Cuál es una forma limpia de establecer una redirección permanente en su lugar, debería ir en web.config o en un controlador global?
Esto es lo que hice:
Tenemos una clase de controlador base que utilizamos para todos nuestros controladores, ahora anulamos:
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);
}
}
Y agregó la siguiente clase:
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 */);
}
}
}
El razonamiento es que quiero una redirección permanente (no temporal) para que los motores de búsqueda corrijan todos los enlaces defectuosos.