mod_rewrite: la página web tiene un bucle de redireccionamiento

mod_rewrite: la página web tiene un bucle de redireccionamiento

Estoy intentando tener un parámetro que venga justo después del nombre de host, como en:

www.dominio.com/parámetro

Por esta razón, configuré la siguiente rewriteRule para dos valores de parámetros con los que me gustaría operar:

RewriteRule ^(en|pt)$ /index.php?language=$1&%{QUERY_STRING} [L]

¡Funciona bien! Sin embargo, necesito crear una nueva regla para redirigir cualquier solicitud sin uno de los parámetros enumerados.

Por esa razón pensé que esto funcionaría:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

Pero desafortunadamente muestra un bucle de redireccionamiento.

He estado recibiendo:

http://hostname/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt//

¡Se agradece cualquier consejo sobre cómo solucionar este problema!

Respuesta1

Eso es porquedirectoriosno sonarchivos regulares.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html(¡No hay HTML DOM idpara el fragmento! El más cercano no está relacionado , ¡incluso falta LA-Ulo que debería haber sido !)id="LA-F"

Puede realizar varias pruebas de atributos de archivos:

'-d' (is directory)
Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
'-f' (is regular file)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

Siempre que el resto de su configuración sea correcta (no estoy seguro de que agregar una barra diagonal sea una buena idea), debe agregar una condición adicional para !-d:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

Además, ¡considere cambiar a nginx! No solo tiene una sintaxis más clara y orientada al uso común, sino que también tiene enlaces directos a documentación relevante, como esta:http://nginx.org/r/if.

comprobar la existencia de un archivo, directorio o enlace simbólico con los operadores “-e” y “!-e”;

Respuesta2

%{REQUEST_URI}es la ruta URI que sigue al nombre de host, por lo tanto, comienza con la barra diagonal:/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(en|pt)$
RewriteRule ^.*$ /pt/$0/ [R=301,L]

información relacionada