2011-12-25 29 views
9


he desarrollado una aplicación web en MVC3 asp.net y ahora tengo que hacer rutas, en minúsculas
Ejemplo:
Enrutamiento url a minúsculas cómo hacerlo?

that's what i have: 
http://www.example.com/SubFolder/Category/Index => looks ugly :-) 

that's how i would like it: 
http://www.example.com/subfolder/category/index 

He encontrado este post:
http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

I realmente necesita usar el código dentro del archivo.asax global en la parte inferior de la página.

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    string lowercaseURL = (Request.Url.Scheme + "://" + 
    HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath); 
    if (Regex.IsMatch(lowercaseURL, @"[A-Z]")) 
    { 
     lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query; 
     Response.Clear(); 
     Response.Status = "301 Moved Permanently"; 
     Response.AddHeader("Location", lowercaseURL); 
     Response.End(); 
    } 
} 

Ahora es la pregunta:
Cuando es usarlo en la estación dev que es la obra de la perfección pero cuando lo subo, a la producción no es de trabajo.

En la estación dev hace es único puesto, sino en la producción que es hace dos:

POST - status: 301 Moved Permanently 
GET - status: 200 OK 

y no me redirecciona a la ruta correcta en absoluto. En la estación de desarrollo, funciona perfectamente.

+0

ASP.NET La URL no distingue entre mayúsculas y minúsculas, ¿cuál es el objetivo de redireccionar a minúsculas URL? Estás creando una sobrecarga de redirección. También redirigir en POST nunca funcionará correctamente. Todo lo que necesita hacer es cambiar su HTML para reflejar una URL de caso más pequeña. Y no existe una ley tal que la url del reparto superior sea mala, ningún cuerpo la mire. El único lugar que importa es en robots.txt que distingue entre mayúsculas y minúsculas. –

+0

@PKKG, no, SEO es insensible a las mayúsculas y minúsculas, y si el enlace de referencia tiene un caso diferente y la redirección a diferentes casos probablemente dañará el SEO, considerándolo como palabras diferentes si es que es sensible a mayúsculas y minúsculas. –

+0

@IamStalker: ¿Puede agregar amablemente una respuesta o sugerencia? como aceptaste la respuesta. La respuesta aceptada se ha eliminado ahora lamentablemente – Pankaj

Respuesta

4
protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    string lowercaseURL = (Request.Url.Scheme + 
    "://" + 
    HttpContext.Current.Request.Url.Authority + 
    HttpContext.Current.Request.Url.AbsolutePath); 
    if (Regex.IsMatch(lowercaseURL, @"[A-Z]")) 
    { 
     System.Web.HttpContext.Current.Response.RedirectPermanent 
     (
      lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query 
     ); 
    } 
} 
+0

+1 y + Bounty. Por favor acepte su propia respuesta. Gracias. – Pankaj

+0

Esta no es la mejor manera de hacerlo. ¿Por qué hacerlo en la aplicación cuando IIS puede encargarse de eso? – Terry

+0

@Terry: ¿puedes agregar tu respuesta? Puedo volver a comenzar generosamente por la respuesta existente. Créame !!!! Esperando su respuesta ... – Pankaj

2

Dado que está utilizando ASP.NET MVC, no creo Application_BeginRequest es el camino a seguir. MVC ofrece opciones mucho mejores para manejar tales requisitos.

También se puede lograr utilizando el módulo IIS Url Rewrite (con configuración Web.config), pero asumo que prefiere un enfoque más programático.

Pruebe con ActionFilter lugar:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class EnforceLowercaseUrlAttribute : ActionFilterAttribute 
{ 
    private bool _redirect; 

    public EnforceLowercaseUrlAttribute(bool redirect = true) 
    { 
     this._redirect = redirect; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     var path = request.Url.AbsolutePath; 
     var containsUpperCase = path.Any(char.IsUpper); 

     if (!containsUpperCase || request.HttpMethod.ToUpper() != "GET") 
      return; 

     if (this._redirect) 
      filterContext.Result = new RedirectResult(path.ToLowerInvariant(), true); 

     filterContext.Result = new HttpNotFoundResult(); 
    } 
} 

Entonces, o aplicarlo a un controlador/Acción:

[EnforceLowercaseUrl] 
public ActionResult Index() 
{ 
    .... 
} 

o registrarse de forma global en su Global.asax:

GlobalFilters.Filters.Add(new EnforceLowercaseUrlAttribute()); 
+0

lol ¿por qué estás usando verdad dos veces? Es elogical e individual por acción o un controlador. Y demasiado código. – IamStalker

+0

Por error, pensé que defaulte a falso. fijo. – haim770

+0

Siempre devuelve un 404. –

0

He aquí cómo Lo hago, creo una ruta personalizada. Esto también hace que los ayudantes como Html.ActionLink creen rutas manipuladas también.

Primero se extienden Route con un objeto personalizado (digamos LowerCaseRoute) y reemplazar el método GetVirtualPath así:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
{ 
    var path = base.GetVirtualPath(requestContext, values); 
    if (path != null) 
    { 
     // you could do lots more here, like replacing odd characters with - etc. 
     path.VirtualPath = path.VirtualPath.ToLower(); 
    } 
    return path; 
} 

Luego de crear una ayuda personalizada para mapear esta ruta así:

public static LowerCaseRoute MapLowerCaseRoute(this RouteCollection routes, string name, string url, object defaults) 
{ 
    var route = new LowerCaseRoute(url, new MvcRouteHandler()); 
    route.Defaults = new RouteValueDictionary(defaults); 
    route.DataTokens = new RouteValueDictionary(); 
    route.DataTokens.Add("RouteName", name); 
    routes.Add(name, route); 
    return route; 
} 

De esta manera puede crear una ruta en su global.asax de esta manera:

RouteTable.Routes.MapLowerCaseRoute("routeName", "baseurl/someother/{param}", { controller = "Controller", param = UrlParameter.Optional }); 

Esto mantiene todo ordenado y obvio dentro del proyecto y le da más opciones para manipular sus rutas.

2

Si esto es simplemente para SEO, la solución más fácil y la que usaría es utilizar la reescritura de URL (suponiendo que está hospedando en IIS) o modificar la redacción (si está alojando en Apache) para aplicar urls minúsculas y dejar publicaciones tal como son.

Con IIS es tan simple como instalar la reescritura de url desde el instalador de la plataforma web, pulse agregar regla y seleccione "aplicar URL en minúsculas". Fácil.

Si actualiza a mvc4 y realmente desea publicaciones en minúscula, existe una propiedad LowercaseUrls que puede establecer en verdadero cuando registre las rutas. Pero de nuevo, no me molestaría.

Cuestiones relacionadas