with route react hashrouter cannot browserrouter url browser url-routing server-side

route - url con múltiples barras diagonales, ¿rompe algo?



redirect in react router (7)

Considere la declaración de la path-absolute relevante non-terminal en "RFC3986: Identificador Uniforme de Recursos (URI): Sintaxis Genérica" (especificado, como es típico, en sintaxis ABNF ):

path-absolute = "/" [ segment-nz *( "/" segment ) ]

Luego, considere la declaración del segment unas líneas más abajo en el mismo documento:

segment = *pchar

Si puede leer ABNF, el asterisco ( * ) especifica que el siguiente elemento pchar puede repetirse varias veces para formar un segment , incluyendo cero veces . Aprendiendo esto y volviendo a leer la declaración path-absolute anterior, puedes ver que un segment potencialmente vacío implica que el segundo "/" puede repetirse indefinidamente , permitiendo combinaciones válidas como ////// (longitud arbitraria de al menos uno) / ) como parte de path-absolute (que a su vez se usa para especificar la regla que describe un URI).

Como todas las URL son URI, podemos concluir que sí, las URL tienen múltiples barras diagonales consecutivas, por cada RFC citado.

Pero no es como si todos siguieran o implementaran analizadores de URI por especificación, por lo que estoy bastante seguro de que hay analizadores de URI / URL no conformes y todo tipo de software que se acumula encima de estos casos donde las esquinas rompen sistemas más grandes.

http://example.com/something/somewhere//somehow/script.js

¿La doble barra rompe algo en el lado del servidor? Tengo un script que analiza las URL y me preguntaba si rompería algo (o cambiaría la ruta) si reemplacé varias barras por una barra. Especialmente en el lado del servidor, algunos marcos como CodeIgniter y Joomla usan esquemas de url segmentados y enrutamiento. Solo querría saber si rompe algo.


HTTP RFC 2396 define el separador de ruta como una sola barra inclinada .

Sin embargo, a menos que esté utilizando algún tipo de reescritura de URL (en cuyo caso las reglas de reescritura pueden verse afectadas por el número de barras), el uri se correlaciona con una ruta en el disco, pero en (¿la mayoría?) Sistemas operativos modernos (Linux / Unix, Windows), los separadores de múltiples rutas en una fila no tienen ningún significado especial, entonces / path / to / foo y / path // to //// foo eventualmente se asignarían al mismo archivo.

Una cosa adicional que podría verse afectada es el almacenamiento en caché. Dado que tanto su navegador como el servidor almacenan en caché las páginas individuales (según su configuración de almacenamiento en caché), solicitar el mismo archivo varias veces a través de URI ligeramente diferentes puede afectar el almacenamiento en caché (dependiendo de la implementación del servidor y del cliente).


La respuesta correcta a esta pregunta es que depende de la implementación del servidor .

Prefacio: la barra doble es sintácticamente válida de acuerdo con RFC 2396, que define la sintaxis de la ruta URL. Como explica amn , por lo tanto, implica un segmento de URI vacío. Sin embargo, tenga en cuenta que RFC 2396 solo define la sintaxis , no la semántica de las rutas, incluidos los segmentos de ruta vacíos, por lo que depende de su servidor decidir la semántica de la ruta vacía.

¿No mencionó la pila de software del servidor que está utilizando, quizás incluso está haciendo su propia? ¡Por favor, utiliza tu imaginación en cuanto a lo que podría ser la semántica!

Prácticamente, me gustaría señalar algunas razones semánticas cotidianas que implican evitar las barras diagonales dobles, aunque sean sintácticamente válidas:

  1. Dado que la validez de los vacíos no es esperada por todos, puede causar errores. Y a pesar de que la tecnología de su servidor de hoy en día podría ser compatible con ella, ya sea la tecnología de su servidor del futuro o la próxima versión de la tecnología de su servidor de hoy podría decidir no apoyarla más. Ejemplo: la biblioteca ASP.NET MVC Web API arroja un error cuando intenta especificar una plantilla de ruta con una barra doble.

  2. Algunos servidores pueden interpretar // como indicando la ruta raíz. Esto puede ser a propósito o un error, y luego es probable que sea un error de seguridad, es decir, una vulnerabilidad de cruce de directorio.

  3. Debido a que a veces es un error y una falla de seguridad, algunos servidores y cortafuegos inteligentes verán la subcadena ''//'', deducirán que posiblemente intentarán explotar tal error y, por lo tanto, devolverán 403 Forbidden o 400 Bad Request , etc., y se niegue a realizar ningún procesamiento adicional del URI.


Las URL no tienen que asignarse a las rutas del sistema de archivos. Entonces, incluso si // en una ruta del sistema de archivos es equivalente a /, no se puede garantizar que lo mismo sea cierto para todas las URL.


Puede que se sorprenda, por ejemplo, al crear enlaces para recursos en su aplicación.

<script src="mysite.com/resources/jquery//../angular/script.js"></script>

no se resolverá en mysite.com/resources/angular/script.js pero en mysite.com/resources/jquery/angular/script.js lo que probablemente no quieras

Las barras dobles son malvadas, trata de evitarlas.


Su pregunta es "¿Rompe algo?" En términos de la especificación de URL, no funciona. No lea el RFC, aquí hay un experimento rápido que puede intentar:

cat > tmp.php <<''EOF'' <?php echo $_SERVER[''REQUEST_URI'']; EOF php -S localhost:4000 tmp.php

Ahora abre tu navegador a http://localhost:4000/hello//world


Una cosa que quizás desee considerar es que podría afectar la indexación de su página en un motor de búsqueda. De acuerdo con this página web,

Una URL con la misma ruta repetida 3 veces no será indexada en Google

El ejemplo que usan es:

example.com/path/path/path/

No he confirmado que esto también sea cierto si utilizó example.com/// , pero ciertamente querría saber si la optimización de SEO fue crítica para mi sitio web.

Mencionan que "Esto es porque Google piensa que ha golpeado una trampa de URL". Si alguien más conoce la respuesta con certeza, por favor agregue un comentario a esta respuesta; de lo contrario, pensé que era relevante incluir este caso para su consideración.