2011-02-08 16 views
30

Il post SO di seguito è completo, ma tutti e tre i metodi descritti non riescono a codificare per periodi.Come codificare i periodi per gli URL in Javascript?

Messaggio: Encode URL in JavaScript?

Ad esempio, se corro tre metodi (cioè, fuga, encodeURI, encodeURIComponent), nessuno di essi codificano periodi.

Quindi "food.store" viene visualizzato come "food.store", che interrompe l'URL. Interrompe l'URL perché l'app Rails non è in grado di riconoscere l'URL come valido e visualizza la pagina di errore 404. Forse si tratta di un errore di configurazione nel file di rotte di Rails?

Qual è il modo migliore per codificare i periodi con Javascript per gli URL?

+8

In che modo si interrompe l'URL? I periodi non devono essere codificati per quanto ne so. – igorw

+0

Grazie, ha aggiornato la domanda per riflettere la sua domanda. – Crashalot

+0

Ho aggiunto "ruby-on-rail" ai tuoi tag - questo non è un problema di URL generale, ma un problema di Rails o qualcosa di specifico per la tua applicazione. – Pointy

risposta

25

I periodi non devono interrompere l'URL, ma non so come si sta usando il periodo, quindi non posso davvero dire. Nessuna delle funzioni che conosco codifica per "." per un URL, nel senso che dovrai utilizzare la tua funzione per codificare il '.' .

Potreste base64 codificare i dati, ma non credo che ci sia un modo nativo di farlo in js. È inoltre possibile sostituire tutti i periodi con il loro equivalente ASCII (% 2E) sul lato client e sul lato server.

In sostanza, non è generalmente necessario per codificare '', quindi se avete bisogno di farlo, avrete bisogno di venire con la propria soluzione. Puoi anche fare ulteriori test per essere sicuro che il '.' in realtà interromperà l'url.

hth

+0

Grazie, ha aggiornato la domanda per riflettere la sua domanda. – Crashalot

+1

@crashalot Penso che la configurazione del routing di Rails debba essere corretta. Non sono un ragazzo di rotaie, ma è possibile che Rails non supporti periodi. Dai un'occhiata a questo URL, credo che risolva il tuo problema: http://masonoise.wordpress.com/2010/02/04/rails-routes-with-string-ids-and-periods/ – superultranova

+0

Non sono riuscito a trovare le mie rotte hanno quindi utilizzato questo lavoro schifoso: Tag.find_by_name (params [: id] + '.' + params [: format]) – rogerdpack

7

I periodi non devono essere codificati negli URL. Here è la RFC da guardare.

Se un punto è "rottura" qualcosa, è possibile che il server stia eseguendo la propria interpretazione dell'URL, il che è una buona cosa da fare, ma significa che è necessario elaborare uno schema di codifica da soli quando i tuoi metacaratteri devono fuggire.

+0

Grazie, ha aggiornato la domanda per riflettere la tua domanda. – Crashalot

46

So che questo è un vecchio thread, ma non ho visto da nessuna parte ecco alcuni esempi di URL che sono stati la causa del problema originale. Ho riscontrato un problema simile io stesso un paio di giorni fa con un'applicazione Java. Nel mio caso, la stringa con il punto era alla fine dell'elemento percorso dell'URL ad es.

http://myserver.com/app/servlet/test.string

In questo caso, la libreria di primavera che sto utilizzando è stato solo a me passare la parte 'test' di quella stringa al relativo parametro di metodo annotato della mia classe di controllo, probabilmente perché stava trattando il ' .string 'come estensione del file e lo spoglia. Forse questo è lo stesso problema di fondo con il problema originale sopra?

Comunque, ero in grado di risolvere questo semplicemente con l'aggiunta di una barra finale all'URL. Sto buttando tutto questo là fuori nel caso sia utile a qualcun altro.

John

+2

grazie stavo avendo lo stesso problema :) – bdeonovic

+2

Grazie! Stavo sbattendo la testa contro il muro con questo problema usando .NET WebApi2. Ho appena aggiunto la barra finale e si è chiarita. Grazie! –

+2

Hmm, questo non ha funzionato con le guide 3.2; la barra finale viene mangiata per prima (prima del periodo e dopo il "tipo" viene spogliata.) –

1

Se il suo possibile utilizzo di un file .htaccess renderebbe davvero fresco e facile. Aggiungi un \ prima del punto. Qualcosa di simile: \.

2

ho avuto la stessa domanda e forse la mia soluzione in grado di aiutare qualcun altro in futuro.

Nel mio caso l'url è stata generata utilizzando JavaScript.I periodi vengono utilizzati per separare i valori nell'URL (sling selectors), pertanto ai selettori stessi non era consentito avere periodi.

mia soluzione era di sostituire tutti i periodi con l'entità html è Figura 1:

Figura 1: Soluzione

var urlPart = 'foo.bar'; 
var safeUrlPart = encodeURIComponent(urlPart.replace(/\./g, '.')); 

console.log(safeUrlPart); // foo%26%2346%3Bbar 
console.log(decodeURIComponent(safeUrlPart)); // foo.bar 
6

Ho avuto lo stesso problema in cui il mio .htaccess stava interrompendo i valori di input con. Dal momento che non ho voglia di cambiare ciò che il .htaccess stava facendo ho usato questo per risolvere il problema:

var val="foo.bar"; 
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E'); 

questo fa tutto la codifica principio sostituisce allora. con lì ASCII equivalente% 2E. PHP converte automaticamente in. nel valore $ _REQUEST ma il .htaccess non lo vede come un periodo quindi le cose vanno tutte bene.

+0

JavaScript escape() convertirà anche% 2E nel periodo originale, questa è la migliore risposta più diretta – mpoplin

+0

Per gli URL codificati in questo modo su una pagina sever rendered almeno, browser decodificare i periodi codificati prima di seguire i collegamenti, quindi in molti casi questo non risolve il problema. –

Problemi correlati