No se puede encontrar una regla htaccess

9

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?

Richard1984
fuente
Si la parte de la solicitud (la parte de la URL después de ".com") no termina con un /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.
peterh - Restablecer Monica

Respuestas:

11

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/testserá redirigido a https://example.org/test/, pero https://example.org/test.htmlno se escribe nuevamente a https://example.org/test.html/(pero nota: https://example.org/test.case/foldertambié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]
Sven
fuente
" /test.case/foldertampoco 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-urlque debería tener una barra diagonal final.
MrWhite
6

Sin validar, pero usando mi experiencia en la reescritura de Apache, esta configuración parece:

  1. Haga coincidir en la parte 'ruta' del URI (no en el servidor, el puerto o los parámetros de consulta), por ejemplo '/my/location/file.html'.
  2. Haga coincidir si esta parte no termina en un carácter '/' (barra inclinada), o no incluye un '.' (punto) personaje.
  3. Use la parte de ruta completa del URI y añádale una barra diagonal.
  4. Envíe una redirección HTTP 301 (permanente) para dirigir el navegador a este nuevo URI.

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]
Joffrey
fuente
!(\/$|\.[^\/]*)- 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).
MrWhite
@MrWhite Buena captura! ¡Actualicé mi respuesta!
Joffrey