2009-01-31 21 views
9

Intento crear URL limpias en mi sitio web. Ahora logré configurar Apache, por lo que todas las solicitudes como mysite.com/page funcionarán. Pero también quiero que las solicitudes de mysite.com/page.php se redireccionarán a mysite.com/page. He establecido la variable de entorno en el .htaccess para comprobar si ya se me ha redireccionado para evitar bucles, pero sigo teniendo ellos ... Aquí está el .htaccess:Clean URL Redirect Loop

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 

RewriteEngine On 
RewriteBase/

# set the variable 
RewriteRule ^$ - [L] 
RewriteRule ^(.*)$ $1 [E=REWROTE:0] 

# this works fine 
# make mysite.com/page work and set REWROTE variable to 1 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1] 

# but if i enable this, i get redirected and then stuck in a loop 
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1 
#RewriteCond %{ENV:REWROTE} !^1$ 
#RewriteRule ^(.*)\.php$ $1 [R=301,L] 

Gracias!

+0

Bienvenido a desbordamiento de pila. Gracias por redactar su pregunta con claridad, proporcionar código y mostrar lo que funciona y lo que no. Si tiene información útil en sus registros de Apache, publíquelo también. A veces, los problemas de redireccionamiento se vuelven más obvios cuando ve los registros. –

+0

Lamentablemente no tengo acceso a ese tipo de información. – oxeleo

Respuesta

14

Añadir esta regla por encima de las reglas de reescritura existentes para detener la reorientación de si la solicitud ya ha sido redirigida una vez (ref):

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 
+0

¡Bingo! Funcionó como el encanto y no hay necesidad de la variable de entorno. – oxeleo

1

se puede comprobar a la línea de solicitud de lo que se ha solicitado originalmente:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ] 
RewriteRule \.php$ %1 [R=301,L] 

Ah, y el primer argumento de RewriteCond directive no es una expresión regular sino solo una cadena. Entonces el escape del . es incorrecto.

+0

Gracias, esto funcionó para mí :) –

0

¿Hay alguna razón por la que no puede usar el carácter de terminación de final de cadena, $?

RewriteRule ^/(.+)\.php$ /$1 

se redirigir a /page.php/página, pero no servirá de nada en la reorientación/página.

Fundamentalmente, usar técnicas como establecer variables de entorno y agregar comprobaciones para REDIRECT_STATUS no será muy sólido.