Pregunta

Me gustaría utilizar la reescritura de mods para convertir direcciones de páginas web como / directorio a /directory/index.html , en una situación de alojamiento de LAMP estándar. Lo que tengo funciona para direcciones que terminan en una barra inclinada. No puedo encontrar una manera de manejar las 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 del servidor 500. 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 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. +) Produce un error de 500 servidores.

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

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

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

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

rewritecond %{REQUEST_URI} !\.html$

produce un error del servidor:

  

La solicitud excedió el límite de 10 redireccionamientos internos debido a un probable error de configuración. Use 'LimitInternalRecursion' para aumentar el límite si es necesario.

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

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

da como resultado un bucle. Se supone que la primera mitad verificará si no termina en .html. Como la segunda mitad agrega .html, parece ser el equivalente funcional de:

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

Obviamente me falta algo.

¿Fue útil?

Solución

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

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

Editar & nbsp; & nbsp; & nbsp; Está utilizando una aserción anticipada ( (?! ...) ). Pero no hay nada después de . * (solo un $ ). Por lo tanto, intente una afirmación retrospectiva:

RewriteRule ^.*$(?<!html) <*>/index.html [L]

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

Otros consejos

Bueno, para que realmente funcione, podría usar una mirada hacia atrás negativa en lugar de una mirada hacia atrás:

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

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

Por qué agregar x hace que funcione: Si el reemplazo coincidirá con la expresión regular, RewriteRule se aplicará nuevamente. Como ejemplo, esto causa un error:

RewriteRule ^(.*)$ $1.rb

porque reemplazaría 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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top