2011-12-25 12 views
9


ho sviluppato un'applicazione Web su asp.net MVC3 e ora ho bisogno di fare percorsi, in caratteri minuscoli
Esempio:
Url di routing in lettere minuscole come?

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 

ho trovato questo post:
http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

I in realtà è necessario utilizzare il codice all'interno del global.asax nella parte inferiore della pagina.

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

Ora è la domanda:
quando è usarlo sulla stazione dev è un lavoro di perfettamente, ma quando ho caricarlo, per la produzione è non funziona.

Sulla stazione dev è rende unico post, ma sulla produzione di essa la fa due:

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

e non vengo reindirizzato al percorso corretto a tutti. Sulla stazione dev funziona perfettamente.

+0

L'URL di ASP.NET non fa distinzione tra maiuscole e minuscole, qual è l'intero punto di reindirizzamento all'URL minuscolo? Stai creando un sovraccarico di reindirizzamento. Anche il reindirizzamento sul POST non funzionerà mai correttamente. Tutto quello che devi fare è cambiare il tuo HTML in modo che rifletta l'URL del caso più piccolo. E non esiste una legge del genere che l'url del cast superiore sia cattivo, nessun corpo lo guardi. L'unico posto che conta è robots.txt che distingue tra maiuscole e minuscole. –

+0

@PKKG, no, il SEO non fa distinzione tra maiuscole e minuscole, e anche se il link di riferimento ha un caso diverso e il reindirizzamento a casi diversi probabilmente danneggerà SEO considerandolo come parole diverse se del tutto sensibili al caso. –

+0

@IamStalker: Puoi gentilmente aggiungere una risposta o un suggerimento? come hai accettato la risposta. La risposta accettata è stata rimossa, purtroppo, – Pankaj

risposta

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 e + Bounty. Per favore accetta la tua risposta Grazie. – Pankaj

+0

Questo non è il modo migliore per farlo. Perché farlo nell'applicazione quando IIS può prendersene cura? – Terry

+0

@Terry: puoi aggiungere una risposta? Posso ancora iniziare la taglia per la risposta esistente. Credimi !!!! Aspetto la tua risposta .... – Pankaj

2

Dal momento che si sta utilizzando ASP.NET MVC, non credo che Application_BeginRequest è la strada da percorrere. MVC offre opzioni molto migliori per gestire tali requisiti.

Può anche essere ottenuto utilizzando il modulo IIS Url Rewrite (con la configurazione Web.config), ma presumo che si preferisca un approccio più programmatico.

Prova con ActionFilter invece:

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

Allora o applicarlo a un controller/Azione:

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

o registrati globalmente in Global.asax:

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

lol perchè stai usando vero due volte? È elogico e individuale per azione o un controller. E troppo codice. – IamStalker

+0

Per errore, ho pensato di impostarlo come falso. fisso. – haim770

+0

Si sta sempre restituendo un 404. –

0

Ecco come Lo faccio, creo un percorso personalizzato. In questo modo anche gli helper come Html.ActionLink creano percorsi manipolati.

Prima porgo Route con un oggetto personalizzato (diciamo LowerCaseRoute) e l'override del metodo GetVirtualPath in questo modo:

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

Poi creo un aiuto personalizzato per mappare questo percorso come questo:

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

In questo modo è possibile creare un itinerario nel proprio global.asax in questo modo:

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

Ciò mantiene tutto ordinato e ovvio all'interno del progetto e offre più opzioni per manipolare i percorsi.

2

Se questo è semplicemente per SEO, la soluzione più semplice e quella che userei è usare riscrittura url (supponendo che tu stia ospitando su IIS) o riscrittura mod (se stai ospitando su Apache) per applicare gli url minuscoli e lascia i post così come sono.

Con IIS è semplice come installare l'url riscrittura dal programma di installazione della piattaforma Web, premere aggiungi regola e selezionare "applica gli URL minuscoli". Facile.

Se si esegue l'aggiornamento a mvc4 e si desiderano realmente post in lettere minuscole, esiste una proprietà LowercaseUrls che è possibile impostare su true quando si registrano i percorsi. Ma di nuovo - non mi preoccuperei.

Problemi correlati