2009-03-02 8 views
5

que me gustaría utilizar mod reescribir en convertir direcciones de las páginas web como /directorio a /directory/index.html, en una situación lámpara estándar de alojamiento. Lo que tengo funciona para direcciones que terminan en una barra inclinada. No puedo encontrar una forma de manejar las direcciones que no terminan con una barra.RewriteEngine en .htaccess para coger los archivos no terminan en html

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 hace que un error 500 de servidor. Si añado una sola letra x para la segunda línea:

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

Se empieza a funcionar, pero sólo 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. +) Da 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 que funciona perfectamente?

[respuesta aceptada] Gracias a Gumbo que era capaz de aproximarse a una solución utilizando RewriteCond:

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

Esto funciona, pero los filtros más que .html - que podría bloquear otras páginas. Por desgracia,

rewritecond %{REQUEST_URI} !\.html$ 

resulta en un error de servidor:

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

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 contiene final en .html. Desde la segunda mitad añade .html, parece que el equivalente funcional de:

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

Obviamente me falta algo.

+0

Sería más útil si pudiera nombrar el error del servidor. – Gumbo

+0

¿No has leído mis notas de edición? La afirmación de mirar hacia adelante mira en la dirección incorrecta. – Gumbo

Respuesta

6

Utilice una directiva RewriteCond para comprobar si la ruta URL no termina con un .html:

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

Editar Estás usando una aserción de preanálisis ((?!…)). Pero no hay nada después de .* (solo un $). Así que trate de una afirmación mirada detrás en su lugar:

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

Pero tenga en cuenta que es probable que tenga Apache 2.2 para utilizar estas afirmaciones.

+0

Esta sugerencia creó un error de 500 servidores, y no soy lo suficientemente experta como para saber quién es. Voy a analizarlo con más detalle y a editar este comentario más adelante. –

+0

¿Y qué dice el registro de errores del servidor? – Gumbo

1

Bueno, en realidad para hacer que funcione, es posible que utilices un negativo de búsqueda hacia atrás en lugar de una búsqueda hacia delante:

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

No estoy seguro de por qué la ligera adición de la 'x' hace que funcione, me quedo editar si lo descubro.

+0

Esta sugerencia creó el mismo error de servidor 500 que mi propuesta original, y de nuevo solo funcionó si agregué una letra al azar antes del (? –

1

Por qué agregar el x hace que funcione: Si el reemplazo coincidirá con la expresión regular, se volverá a aplicar RewriteRule. A modo de ejemplo, esto provoca 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 el ejemplo, se agrega index.html hasta el final. Cuando hay un x al final de la expresión regular, entonces no coincidirá con su reemplazo, que termina en l.

+0

No debería hacer esto en la muestra provista por andrew como [L] en el final de la línea debería evitarlo. –

+0

Lo siento, de alguna manera no vi la [L] allí. He editado mi respuesta para que no diga nada incorrecto. Lo veré más para ver si puede averiguar la razón real. Gracias. –

+0

Veo cómo este ejemplo crea un ciclo, pero no veo cómo se aplica a mi pregunta, lo que estoy tratando de hacer es "si la dirección no termina en .html, add.html a la dirección ". ¿Cómo afecta [L] a eso? –

Cuestiones relacionadas