Tengo esto en mi htaccess pero no puedo entender para qué sirve. Debido a la naturaleza de la regla, la búsqueda tampoco ayuda.
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
¿Alguien puede explicar para qué sirve?
Tengo esto en mi htaccess pero no puedo entender para qué sirve. Debido a la naturaleza de la regla, la búsqueda tampoco ayuda.
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
¿Alguien puede explicar para qué sirve?
Respuestas:
Toda esta regla hace es añadir un arrastre /
a sus URL si no hay ninguno, y si no hay .
en el URI, por lo que https://example.org/test
será redirigido a https://example.org/test/
, pero https://example.org/test.html
no se escribe nuevamente a https://example.org/test.html/
(pero nota: https://example.org/test.case/folder
también no ser redirigidos a https://example.org/test.case/folder/
, ya que contiene a .
en el URI).
## Do the following if the URI does not end with `/` or does not contain an `.`:
## the . is relevant for file names like test.html, which should n
RewriteCond %{REQUEST_URI} !(/$|\.)
## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
/test.case/folder
tampoco será redirigido": punto menor, pero si "carpeta" es un directorio del sistema de archivos, mod_dir emitirá (por defecto) una redirección 301 para agregar una barra inclinada final. Solo es un problema si es /test.case/some-other-virtual-url
que debería tener una barra diagonal final.
Sin validar, pero usando mi experiencia en la reescritura de Apache, esta configuración parece:
Esto dará como resultado los siguientes casos de prueba
/ -> /
/test -> /test/
/my/resource -> /my/resource/
/my/resource.type -> /my/resource.type
/edge.case/resource -> /edge.case/resource
Así que creo que la regla tiene el propósito de agregar barras a los recursos que no parecen ser un archivo, pero parece tener un caso límite.
Si no agrega una barra diagonal a un recurso con '.' (punto) en la parte de la ruta que no pertenece al archivo, la expresión regular debe cambiarse a:
# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
!(\/$|\.[^\/]*)
- Su expresión regular actualizada no es realmente diferente. También necesita un ancla de fin de cadena en la segunda parte (que coincide con la extensión). Tal vez algo como: !(/|\.[a-zA-Z]+)$
(no es necesario escapar de las barras).
/
y no contiene un ".
", entonces redirija la solicitud agregándola con un/
. La intención probable de esta regla es manejar la indexación automática de directorios.