2011-02-08 19 views
30

La publicación SO a continuación es completa, pero los tres métodos descritos no codifican para los períodos.Cómo codificar períodos para URL en Javascript?

la publicación: Encode URL in JavaScript?

Por ejemplo, si corro los tres métodos (es decir, escape, encodeURI, encodeURIComponent), ninguno de ellos codifican períodos.

Así que "food.store" aparece como "food.store", que rompe la URL. Rompe la URL porque la aplicación Rails no puede reconocer la URL como válida y muestra la página de error 404. Tal vez es un error de configuración en el archivo de rutas de Rails?

¿Cuál es la mejor manera de codificar períodos con Javascript para URL?

+8

¿De qué manera rompe la URL? Los periodos no tienen que codificarse por lo que yo sé. – igorw

+0

Gracias, actualizó la pregunta para reflejar su pregunta. – Crashalot

+0

Agregué "ruby-on-rails" a sus etiquetas; este no es un problema de URL general, sino un problema de Rails o algo específico de su aplicación. – Pointy

Respuesta

25

Los períodos no deben romper la URL, pero no sé cómo está usando el punto, así que no puedo decirlo. Ninguna de las funciones que conozco codifican el '.' para una url, lo que significa que tendrá que usar su propia función para codificar el '.' .

Puede codificar 64 en base, pero no creo que haya una manera nativa de hacerlo en js. También puede reemplazar todos los períodos con su equivalente ASCII (% 2E) tanto del lado del cliente como del servidor.

Básicamente, generalmente no es necesario codificar '.', Por lo que si necesita hacerlo, tendrá que encontrar su propia solución. También puede realizar más pruebas para asegurarse de que el '.' en realidad romperá la url.

hth

+0

Gracias, actualizó la pregunta para reflejar su pregunta. – Crashalot

+1

@crashalot Creo que la configuración de enrutamiento de Rails debe ser reparada. No soy un tipo de barandillas, pero es posible que Rails no soporte periodos. Consulte esta url, creo que aborda su problema: http://masonoise.wordpress.com/2010/02/04/rails-routes-with-string-ids-and-periods/ – superultranova

+0

No pude encontrar mis rutas tan usadas en este trabajo de mierda: Tag.find_by_name (params [: id] + '.' + params [: format]) – rogerdpack

7

Los periodos no tienen que estar codificados en las URL. Here es el RFC a tener en cuenta.

Si un período está "rompiendo" algo, es posible que su servidor esté haciendo su propia interpretación de la URL, lo cual es una buena cosa que hacer, por supuesto, pero significa que tiene que idear algún esquema de codificación propio cuando tus propios metacaracteres necesitan escaparse.

+0

Gracias, actualizó la pregunta para reflejar tu pregunta. – Crashalot

46

Sé que esto es un hilo viejo, pero no vi en cualquier lugar a continuación algunos ejemplos de direcciones URL que estaban causando el problema original. Me encontré con un problema similar hace unos días con una aplicación Java. En mi caso, la cadena con el período estaba al final del elemento path de la URL, por ejemplo.

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

En este caso, la biblioteca de primavera que estoy usando sólo era pasándome la parte de 'prueba' de esa cadena en el parámetro del método anotado relevante de mi clase del controlador, presumiblemente debido a que estaba tratando a la ' .string 'como una extensión de archivo y quitándolo. Tal vez este es el mismo problema subyacente con el problema original anterior?

De todos modos, pude solucionar esto simplemente agregando una barra inclinada a la URL. Solo tirando esto en caso de que sea útil para alguien más.

John

+2

gracias, estaba teniendo el mismo problema :) – bdeonovic

+2

¡Gracias, yo! Estaba golpeando mi cabeza contra la pared con este problema usando .NET WebApi2. Acabo de agregar la barra final y se aclaró. ¡Gracias! –

+2

Hmm, esto no funcionó usando los carriles 3.2; la barra final se come primero (antes de que el período y el siguiente "tipo" se eliminen. ¿Alguna idea? –

1

Si su posible usando un archivo .htaccess haría muy fresco y fácil. Simplemente agregue un \ antes del período. Algo como: \.

2

Tuve la misma pregunta y tal vez mi solución pueda ayudar a alguien más en el futuro.

En mi caso, la URL se generó mediante javascript.Los períodos se utilizan para separar los valores en la url (sling selectors), por lo que los selectores no pueden tener períodos.

Mi solución fue la de sustituir todos los períodos de la entidad HTML como es Figura 1:

Figura 1: Solución

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

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

Tuve el mismo problema con el que mi .htaccess estaba rompiendo los valores de entrada. Como yo no quiero cambiar lo que el estaba haciendo .htaccess He utilizado este para solucionarlo:

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

esto hace todo el estándar de codificación reemplaza entonces. con alli ascii equivalente% 2E. PHP convierte automáticamente de nuevo a. en el valor $ _REQUEST, pero el .htaccess no lo ve como un punto, por lo que todo está bien.

+0

Javascript escape() también convertirá% 2E al período original; esta es la mejor y más directa respuesta. – mpoplin

+0

Para las URL codificadas de esta manera en una página cortada como mínimo, navegadores decodificar los períodos codificados antes de seguir los enlaces, por lo que esto no resuelve el problema en muchos casos. –

Cuestiones relacionadas