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?
Puede usar la etiqueta BASE, si no desea usar rutas absolutas:
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'']).''" />'';