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 id
para el fragmento! El más cercano no está relacionado , ¡incluso falta LA-U
lo 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]