Saltar al contenido

¿Cómo funciona RewriteBase en .htaccess?

Buscamos por distintos sitios y así regalarte la solución para tu duda, en caso de alguna inquietud déjanos la duda y te contestaremos porque estamos para ayudarte.

Solución:

En mis propias palabras, después de leer los documentos y experimentar:

Puedes usar RewriteBase para proporcionar un base para tus reescrituras. Considera esto

# invoke rewrite engine
    RewriteEngine On
    RewriteBase /~new/

# add trailing slash if missing
    rewriteRule ^(([a-z0-9-]+/)*[a-z0-9-]+)$ $1/ [NC,R=301,L]

Esta es una regla real que utilicé para asegurarme de que las URL tengan una barra inclinada al final. Esto convertirá

http://www.example.com/~new/page

para

http://www.example.com/~new/page/

Al tener el RewriteBase allí, haces que el camino relativo se salga del RewriteBase parámetro.

RewriteBase solo se aplica a la objetivo de un relativo reescribir la regla.

  • Usando RewriteBase así …

    RewriteBase /folder/
    RewriteRule a.html b.html
    
  • es esencialmente lo mismo que …

    RewriteRule a.html /folder/b.html
    
  • Pero cuando el archivo .htaccess está dentro /folder/ entonces esto también apunta al mismo objetivo:

    RewriteRule a.html b.html
    

Aunque los documentos implican que siempre se usa un RewriteBase, Apache generalmente lo detecta correctamente para las rutas bajo DocumentRoot a menos que:

  • Tu estas usando Alias directivas

  • Está utilizando las reglas de reescritura de .htaccess para realizar Redireccionamientos HTTP (en lugar de una simple reescritura silenciosa) para URL relativas

En estos casos, es posible que necesite especificar RewriteBase.

Sin embargo, dado que es una directiva confusa, generalmente es mejor especificar simplemente URI absolutos (también conocidos como “relativos a la raíz”) en sus objetivos de reescritura. Otros desarrolladores que lean sus reglas las entenderán más fácilmente.


Citando la excelente respuesta en profundidad de Jon Lin aquí:

En un archivo htaccess, mod_rewrite funciona de manera similar a un o envase. y el RewriteBase se utiliza para proporcionar una base de ruta relativa.

Por ejemplo, digamos que tiene esta estructura de carpetas:

DocumentRoot
|-- subdir1
`-- subdir2
    `-- subsubdir

Para que puedas acceder a:

  • http://example.com/ (raíz)
  • http://example.com/subdir1 (subdirector1)
  • http://example.com/subdir2 (subdirectorio2)
  • http://example.com/subdir2/subsubdir (subsubdir)

El URI que se envía a través de un RewriteRule es relativo al directorio que contiene el archivo htaccess. Entonces, si tienes:

RewriteRule ^(.*)$ - 
  • En el htaccess raíz, y la solicitud es /a/b/c/d, luego el URI capturado ($1) es a/b/c/d.
  • Si la regla está en subdir2 y la solicitud es /subdir2/e/f/g entonces el URI capturado es e/f/g.
  • Si la regla está en el subsubdir, y la solicitud es /subdir2/subsubdir/x/y/z, entonces el URI capturado es x/y/z.

El directorio en el que se encuentra la regla tiene esa parte eliminada del URI. La base de reescritura no tiene ningún efecto en esto, así es simplemente como funciona por directorio.

Lo que la base de reescritura lo hace hacer, es proporcionar una base de ruta de URL (no una base de ruta de archivo) para cualquier ruta relativa en el objetivo de la regla. Entonces digamos que tienes esta regla:

RewriteRule ^foo$ bar.php [L]

los bar.php es una ruta relativa, a diferencia de:

RewriteRule ^foo$ /bar.php [L]

donde el /bar.php es un camino absoluto. El camino absoluto siempre ser la “raíz” (en la estructura de directorios anterior). Eso significa que independientemente de si la regla está en la “raíz”, “subdir1”, “subsubdir”, etc. /bar.php la ruta siempre se asigna a http://example.com/bar.php.

Pero la otra regla, con la ruta relativa, se basa en el directorio en el que se encuentra la regla. Así que si

RewriteRule ^foo$ bar.php [L]

está en la “raíz” y vas a http://example.com/foo, te sirven http://example.com/bar.php. Pero si esa regla está en el directorio “subdir1” y vas a http://example.com/subdir1/foo, te sirven http://example.com/subdir1/bar.php. etc. Esto a veces funciona y otras no, como dice la documentación, se supone que es requerido para rutas relativas, pero la mayoría de las veces parece funcionar. Excepto cuando está redireccionando (usando el R bandera, o implícitamente porque tienes http://host en el objetivo de su regla). Eso significa esta regla:

RewriteRule ^foo$ bar.php [L,R]

si está en el directorio “subdir2” y vas a http://example.com/subdir2/foo, mod_rewrite confundirá la ruta relativa con una ruta de archivo en lugar de una ruta de URL y debido a la R flag, terminarás siendo redirigido a algo como: http://example.com/var/www/localhost/htdocs/subdir1. Que obviamente no es lo que quieres.

Aquí es donde RewriteBase entra. La directiva le dice a mod_rewrite qué agregar al principio de cada ruta relativa. Entonces, si tengo:

RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]

en “subsubdir”, yendo a http://example.com/subdir2/subsubdir/foo realmente me servirá http://example.com/blah/bar.php. El “bar.php” se agrega al final de la base. En la práctica, este ejemplo no suele ser lo que desea, porque no puede tener varias bases en el mismo contenedor de directorio o archivo htaccess.

En la mayoría de los casos, se usa así:

RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]

donde esas reglas estarían en el directorio “subdir1” y

RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]

estaría en el directorio “subsubdir”.

Esto le permite en parte hacer que sus reglas sean portátiles, por lo que puede colocarlas en cualquier directorio y solo necesita cambiar la base en lugar de un montón de reglas. Por ejemplo, si tuvieras:

RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...

tal que va a http://example.com/subdir1/foo servirá http://example.com/subdir1/bar.php etc. Y digamos que decidió mover todos esos archivos y reglas al directorio “subsubdir”. En lugar de cambiar cada instancia de /subdir1/ para /subdir2/subsubdir/, podrías haber tenido una base:

RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...

Y luego, cuando necesite mover esos archivos y las reglas a otro directorio, simplemente cambie la base:

RewriteBase /subdir2/subsubdir/

y eso es.

AFAIK, RewriteBase solo se usa para arreglar casos en los que mod_rewrite se ejecuta en un .htaccess archivo no en la raíz de un sitio y adivina la ruta web incorrecta (a diferencia de la ruta del sistema de archivos) para la carpeta en la que se está ejecutando. Entonces, si tiene una RewriteRule en un .htaccess en una carpeta que se asigna a http://example.com/myfolder puedes usar:

RewriteBase myfolder

Si mod_rewrite no funciona correctamente.

Intentar usarlo para lograr algo inusual, en lugar de solucionar este problema, suena como una receta para confundirse mucho.

Tienes la posibilidad compartir esta crónica si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *