rewriterule rewritecond rewritebase mod_rewrite htaccess ejemplos amigables apache .htaccess url-rewriting

apache - rewritecond - rewriterule htaccess ejemplos



Clean URL Redirect Loop (4)

Intento crear URL limpias en mi sitio web. Ahora logré configurar apache para que cada solicitud como mysite.com/page funcione. Pero también quiero que las solicitudes de mysite.com/page.php se redirijan a mysite.com/page . Establecí la variable de entorno en .htaccess para verificar si ya se me redirigió para evitar bucles, pero todavía los obtengo ... Aquí está el .htaccess:

<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!


Agregue esta regla sobre las reglas de reescritura existentes para detener la redirección si la solicitud ya se redirigió una vez ( ref ):

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


Puede verificar la línea de solicitud de lo que originalmente se solicitó:

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

Ah, y el primer argumento de la directiva RewriteCond no es una expresión regular, sino solo una cadena. Entonces escapando de . Está Mal.


¿Hay algún motivo por el que no puedas utilizar el carácter de finalización de cadena, $?

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

redireccionará /page.php a / page, pero no hará ningún redireccionamiento en / page.

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


Otra forma rápida y sucia de evitar el bucle en estas situaciones que he encontrado es agregar una cadena de consulta y luego verificar su existencia en el redireccionamiento.

RewriteCond %{QUERY_STRING} !a=a RewriteRule ^(.*)/.php$ %1 [NC,R=301,L] RewriteRule ^(.*)$ $1.php?a=a [NC,L]

encontrado en este sitio: http://answers.oreilly.com/topic/542-how-to-properly-redirect-for-maximum-seo/