2010-10-04 10 views
19

Ho una risorsa che è un . Questo significa il mio URL simile a questa: http://myapp/index/ . e ho bisogno di aggiungere parametri di query in modo che assomiglia a questo: http://myapp/index/.?type=xml io uso Freemarker per la presentazione delle mie risorse e ha fatto un hack percentuale di codifica per questo caso:Una risorsa URL che è un punto (% 2E)

<#if key?matches("\\.")> 
<li><a href="${contextPath}/index/%2E">${key}</a></li> 
</#if> 

questo funziona bene per Firefox. Ma tutti gli altri browser come IE, Safari, Chrom, Opera ignorano semplicemente il mio punto codificato nell'URL (http://myapp/index/%2E).

Qualche suggerimento?

risposta

14

E 'in realtà non molto chiaramente indicato nello standard (RFC 3986) se una versione per cento con codifica di . o .. si suppone di avere lo stesso significato questa cartella/up-a-cartella della versione escape. La sezione 3.3 parla solo di "I segmenti del percorso . e ..", senza chiarire se corrispondono a . e .. prima o dopo codifica pct.

Personalmente trovo che l'interpretazione di Firefox che %2E non significa . più pratico, ma sfortunatamente tutti gli altri browser non sono d'accordo. Ciò significherebbe che non è possibile avere un componente di percorso contenente solo . o ...

Penso che l'unico suggerimento possibile sia "non farlo"! Esistono anche altri componenti del percorso che sono fastidiosi, in genere a causa delle limitazioni del server: %2F, %00 e %5C sequenze nei percorsi possono anche essere bloccati da alcuni server Web e anche il segmento del percorso vuoto può causare problemi. Quindi, in generale, non è possibile adattare tutte le possibili sequenze di byte in un componente di percorso.

+0

mi sa che devo voglia che poi, thx. – cuh

+1

Ho scoperto che anche se% 2e fa parte di un URL, ad es. 'http: // localhost/index% 2ehtml', Firefox (14) e Chrome lo convertono in un' .'. Questo è specificato nella sezione 2.3. Più avanti nella sezione 3.3, dice che '.' e' ..' sono per riferimento relativo all'interno del pathname. Quindi, 'http: // localhost /% 2e' significherebbe essenzialmente' http: // localhost/'. – slowpoison

+1

Good point, @slowpoison - "Gli URI che differiscono nella sostituzione di un carattere non prenotato con il corrispondente ottetto US-ASCII codificato in percentuale sono equivalenti", e "." è un personaggio senza riserve. Ah bene. – phyzome

5

Non è possibile. §2.3 dice che "." è un carattere non prenotato e che "URI che differiscono nella sostituzione di un personaggio non prenotato con il corrispondente ottetto US-ASCII codificato in percentuale sono equivalenti". Pertanto, /%2E%2E/ è lo stesso di /../ e verrà normalizzato.

(Questa è una combinazione di una risposta da parte bobince e un commento di slowpoison.)

Problemi correlati