mod_rewrite htaccess activar apache mod-rewrite

htaccess - Cómo utilizar la reescritura mod_rewrite de apache sin cambiar las rutas relativas



mod_rewrite apache2 debian (6)

Tengo la siguiente regla de reescritura en .htaccess:

RewriteRule ^groups/([^//.]+)/?$ groupdetail.php?gname=$1 [L,NC]

Esto toma algo como www.example.com/groups/groupname y llama a www.example / groupdetail.php? Gname = groupname. Y funciona bien.

Pero todos los enlaces relativos en groupdetail.php usan grupos / como la ruta relativa, y no quiero que lo hagan. ¿Cómo evito esto?

Por ejemplo, cuando un usuario hace clic en un enlace <a href="link.php"> en groupdetail.php? Gname = groupname, se lo lleva a www.example / groups / link.php. Quiero llevar al usuario a www.example.com/link.php.

Obviamente, quiero URL para que el usuario se vea como "www.example.com/groups/groupname", por lo que no quiero usar [R] / redirect.


Si cambia la regla de rewite para hacer un redireccionamiento forzado (agregue la opción [R]), el navegador usará la URL /groupdetail.php y los enlaces relativos funcionarán bien. Sin embargo, eso agrega una redirección y hace que las URL sean menos bonitas.

RewriteRule ^groups/([^/.]+)/?$ groupdetail.php?gname=$1 [L,NC,R]


Los enlaces relativos los resuelve el navegador, no el servidor, por lo que no hay nada que pueda hacer con mod_rewrite.

Utilice enlaces relativos, suba la jerarquía ( ../link.php ) o use enlaces absolutos.


Si, como yo, tuvieras cientos de enlaces relativos en la página, inserta un <base href=""> en el <head> con una ruta absoluta (también podrías usar el relativo). Necesitarás también hacer que la ruta a los archivos .js sea <head> absoluta <head> porque IE y firefox tratan el href base de manera diferente. Estoy de acuerdo que es un problema molesto.


La respuesta de Hop es correcta. El navegador ve www.example.com/groups/groupname como la dirección, por lo que considera que /groups es el directorio actual. Por lo tanto, se supone que todos los enlaces como <a href=link.php> están en la carpeta /groups .

Cuando el usuario mueve su mouse sobre el enlace, verá www.example.com/groups/link.php como la dirección del enlace.

La solución es usar enlaces absolutos: simplemente agregue una barra antes del href:

<a href=/link.php>

El usuario verá entonces www.example.com/link.php como la url.

Dicho esto, parece que de su pregunta está usando enlaces relativos a propósito ... ¿tiene alguna razón para no usar enlaces absolutos?



Si no desea tener enlaces absolutos o usa <base> porque va a mover la página, puede hacer que php genere la base de la siguiente manera:

echo ''<base href="http://''.$_SERVER[''SERVER_NAME''].str_replace("index.php","",$_SERVER[''PHP_SELF'']).''" />'';