Estoy trabajando en un proyecto de sitio web, www.experimonkey.com . En el directorio raíz, tengo directorios para experimentos, juegos, etc., que he estado sirviendo dinámicamente con php. Quiero limpiar las URL para que, en lugar de /experiments?eid=homemade-lava-lamp , por ejemplo, un usuario pueda ir a /experiments/homemade-lava-lamp . También me gustaría tener una redirección para que si un usuario va al enlace anterior, /experiments?eid=homemade-lava-lamp , sea redirigido al enlace limpio.
Pensé que había descubierto la primera parte del problema con el siguiente código en /experiments/.htaccess :
RewriteEngine On RewriteRule ^([a-zA-Z0-9\-]+)/?$ index.php?eid=$1 [L] Esto funciona para las páginas dinámicas; sin embargo, más tarde me di cuenta de que esto arruinaría los otros directorios reales en la carpeta /experiments . Por ejemplo, la dirección /experiments/submit (que en realidad es /experiments/submit/index.php ) redirige a /experiments/submit?eid=submit --por qué, no tengo idea.
Pero también, sin importar las combinaciones del siguiente código que probé (y todos los demás hilos y documentación que he leído), no pude obtener la URL anterior para redirigir a la URL limpia:
RewriteCond %{QUERY_STRING} eid=(.+) RewriteRule .+ https://www.experimonkey.com/experiments/%1 [R=301]Motor de reescritura encendido
Lo he resuelto hasta aquí. Ahora todo funciona en su mayoría, excepto que las dos últimas partes crean un bucle infinito y no estoy seguro de cómo solucionarlo.
#Ignore existing directories and files unless has query string RewriteCond %{QUERY_STRING} !eid=(.*) RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -l RewriteRule ^ - [L] #Redirect and remove query string RewriteCond %{QUERY_STRING} /?eid=(.*) RewriteRule (.*) https://www.experimonkey.com/experiments/%1? [R=301,L] #Rewrite internally to actual URL RewriteRule ^([a-zA-Z0-9\-]+)/?$ index.php?eid=$1 [L]Finalmente lo descubrí. Espero que esto pueda ayudar a alguien en algún lugar del camino (honestamente, no puedo creer cuánto tiempo me llevó descubrirlo).
#Ignore existing directories and files unless has query string RewriteCond %{QUERY_STRING} !eid=(.*) RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -l RewriteRule ^ - [L] #Redirect and remove query string. #First line was the crucial condition to stop loop by checking for internal redirect first. RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{QUERY_STRING} /?eid=(.*) RewriteRule (.*) https://www.experimonkey.com/experiments/%1? [R=301,L] #Rewrite internally to actual URL RewriteRule ^([a-zA-Z0-9\-]+)/?$ index.php?eid=$1 [L]