Rewriteengine en .htaccess para capturar archivos que no terminan en html

Me gustaría utilizar mod rewrite in para convertir direcciones de páginas web como / directory a /directory/index.html , en una situación estándar de alojamiento de LAMP. Lo que tengo funciona para direcciones que terminan en una barra inclinada. No puedo encontrar una forma de manejar direcciones que no terminan con una barra inclinada .

Lo que parece que debería funcionar es:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */ rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */ 

Pero la segunda línea causa un error de 500 servidores. Si agrego una sola letra x a la segunda línea:

 rewriterule ^(.*)/$ $1/index.html [L] rewriterule ^(.*x(?!html))$ $1/index.html [L] 

Comienza a funcionar, pero solo para los nombres de directorio que terminan en una x . He intentado reemplazar la x con muchas cosas diferentes. Cualquier cosa más complicada que los caracteres reales (como [^ x] o. +) Da un error de 500 servidores.

Y, para satisfacer mi propia curiosidad, ¿alguien sabe por qué la adición de una sola letra real marca la diferencia entre un error del servidor y una regla que funciona perfectamente?

[Respuesta aceptada] Gracias a Gumbo, pude aproximar una solución usando rewritecond:

 rewritecond% {REQUEST_URI}! \. [^ /] + $
 reescritura (. +) $ 1 / index.html [L]

Esto funciona, pero filtra más que solo .html: podría bloquear otras páginas. Desafortunadamente,

 rewritecond %{REQUEST_URI} !\.html$ 

da como resultado un error del servidor:

La solicitud excedió el límite de 10 redirecciones internas debido a un probable error de configuración. Use ‘LimitInternalRecursion’ para boost el límite si es necesario.

Todavía me gustaría saber por qué:

 rewriterule ^(.*(?!html))$ $1/index.html [L] 

resultados en un bucle. Se supone que la primera mitad verifique si no termina en .html. Dado que la segunda mitad agrega .html, parece ser el equivalente funcional de:

 while (substr ($ address, -4)! = 'html') $ address. = 'html'

Obviamente me falta algo.

Use una directiva RewriteCond para verificar si la ruta de la URL no termina con un .html :

 RewriteCond %{REQUEST_URI} !\.html$ RewriteRule ^(.*[^/])?/?$ $1/index.html [L] 

Editar Está utilizando una afirmación de anticipación ( (?!…) ). Pero no hay nada después .* (Solo un $ ). Por lo tanto, intente una afirmación de mirar hacia atrás:

 RewriteRule ^.*$(? 

Pero tenga en cuenta que probablemente necesite Apache 2.2 para usar estas afirmaciones.

Bueno, para que realmente funcione, podrías usar un look-negative negativo en lugar de un lookahead:

 RewriteRule ^(.*)(? 

No estoy seguro de por qué agregar la 'x' hace que funcione, lo editaré si lo resuelvo.

Por qué agregar el x hace funcionar: si el reemplazo coincidirá con la expresión regular, se volverá a aplicar RewriteRule. Como ejemplo, esto causa un error:

 RewriteRule ^(.*)$ $1.rb 

porque reemplazaría la script con script.rb . Eso coincide con la expresión regular, por lo que reemplaza script.rb con script.rb.rb , una y otra vez …

Esto se insinúa en el registro de errores:

 Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. 

En su ejemplo, agrega index.html al final. Cuando hay una x al final de la expresión regular, entonces no coincidirá con su reemplazo, que termina en un l .