2011-12-21 13 views
10

Alcuni anni fa ho creato un sito ASP.NET basato su database, che utilizza una singola pagina APSX per visualizzare tutte le pagine del sito. Quindi, tutti gli URL del sito sono nel seguente formato:Più segno nella stringa di query per il sito ASP.NET

/main.aspx?page=Page+Title+One 

/main.aspx?page=Another+Article+Title 

/main.aspx?page=Third+Page 

La pagina main.aspx ottiene i dati di stringa di query (pagina + Titolo + One, per esempio) e lo utilizza come una chiave per tirare l'articolo appropriato contenuto dal database del server SQL. Il titolo effettivo della pagina è memorizzato nel db con spazi invece di vantaggi (ad esempio "Titolo pagina uno").

La scarsa decisione di andare con il segno + come separatore di parole nella stringa di query URL sta causando molti problemi con i motori di ricerca ultimamente (contenuto duplicato, ecc.), Quindi voglio correggerlo, ma senza modificare gli URL .

Quello che voglio fare è con il motore di ricerca o un visitatore cerca di visitare l'URL sbagliato mancano i segni + e avere spazi bianchi, invece, ad esempio:

/main.aspx?page=Page Title One 

voglio fare 301 redirect permanente:

/main.aspx?page=Page+Title+One 

per essere in grado di fare questo ho bisogno di controllare se il valore stringa di query ha vantaggi o spazi bianchi, ma quando arrivo il valore con Request.QueryString [ "pagina"], anche se la stringa effettiva quesry ha i vantaggi in esso ottengo ancora una stringa con spazi bianchi "Pagina Titolo Uno".

Il sito funziona su IIS6/Win 2003.

Come posso fare questo?

risposta

2

Beh, ovviamente non è possibile inserire uno spazio in un URI in ogni caso. Quello che puoi fare è inserire %20 in cui è il modo di codificare uno spazio in qualsiasi punto di un URI e + è il modo normale di codificare uno spazio nella porzione di query e il modo consigliato di farlo in quella porzione di perché% 20 può causare problemi.

A causa di questo è un dettaglio implementaiton application/x-www-form-urlencoded e normalmente si preoccupano i dati effettivi inviati, Request.QueryString[] fa l'unescaping per voi, girando sia + e %20 in uno spazio.

Si desidera guardare il Request.RawUrl (restituisce una stringa) o Request.Url che restituisce un Uri. Probabilmente il più semplice è quello di alimentare Request.Url in un UriBuilder in modo da poter modificare solo la query e ottenere un Uri indietro.

Eppure, io consiglierei l'approccio opposto, se hai problemi con contenuti duplicati a causa delle due possibili modi di codifica uno spazio nella stringa di query, andare con la norma raccomandata e trasformare i casi di %20 in + piuttosto che il contrario.

var u = Request.Url; 
if(u.Query.Contains("%20")) 
{ 
    var ub = new UriBuilder(u); 
    Console.WriteLine(ub.Query); 
    string query = ub.Query; 
    //note bug in Query property - it includes ? in get and expects it not to be there on set 
    ub.Query = ub.Query.Replace("%20", "+").Substring(1); 
    Response.StatusCode = 301; 
    Response.RedirectLocation = ub.Uri.AbsoluteUri; 
    Response.End(); 
} 
+0

I miei URL hanno sempre utilizzato solo il segno più invece degli spazi bianchi o il% 20, tuttavia vedo le pagine memorizzate nella cache in Google come queste 2: /main.aspx?page=KW1 KW2 e /main.aspx?page=KW1% 20KW2, che sono entrambi sbagliati e causano problemi di contenuto duplicato. Ora voglio 301 loro l'URL corretto che è /main.aspx?page=KW1+KW2. –

+0

Questo è praticamente ciò che stavo spiegando. Non sono sicuro di cosa non fosse chiaro, quindi ho aggiunto un esempio di codice che, si spera, spiega. –

+0

Grazie Jon, questo è esattamente quello di cui avevo bisogno :). Come contrassegno la domanda come risposta? –

3

Il segno + viene interpretato come uno spazio per gli URL.

Cioè, al fine di codificare URL uno spazio, è possibile utilizzare %20 o +.

Vedere "this SO answer" all'URL che codifica il carattere dello spazio: + o% 20? "

4

Utilizzando Request["key"], converte automaticamente tutti i segni "+" in spazi. Devi usare Request.RawUrl per vedere se ci sono più segni.

Inoltre, è possibile utilizzare System.Web.HttpUtility.ParseQueryString per analizzare qualsiasi query stringa. Si può semplicemente verificare se Request.QueryString.ToString().Contains("+") è vero, e fare la logica da lì.

+0

Questo è esattamente il mio problema. Voglio essere in grado di fare una distinzione tra le seguenti 2 richieste GET: /main.aspx?page=KW1+KW2 e /main.aspx?page=KW1 KW2. –

+0

Vedere il mio post originale. Sembra 'Request.QueryString.ToString(). Contains (" + ")' ti darà se è il primo o il secondo caso. –

+0

Sì, ma questo non risolverà un URL errato nel seguente formato /main.aspx?page=KW1 KW2 + KW3. –

0

si può provare questo:

Request.QueryString["page"].Trim(); 
Problemi correlati