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
) esa/b/c/d
. - Si la regla está en
subdir2
y la solicitud es/subdir2/e/f/g
entonces el URI capturado ese/f/g
. - Si la regla está en el
subsubdir
, y la solicitud es/subdir2/subsubdir/x/y/z
, entonces el URI capturado esx/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ó.