He visto esto en algunos .htaccess
ejemplos.
RewriteBase /
Parece ser algo similar en funcionalidad al <base href="">
HTML.
¿Creo que puede anteponer automáticamente su valor al comienzo de las RewriteRule
declaraciones (posiblemente las que no tienen una barra inclinada)?
No pude hacerlo funcionar correctamente. Creo que su uso podría ser muy útil para la portabilidad del sitio, ya que a menudo tengo un servidor de desarrollo que es diferente a uno de producción. Mi método actual me deja eliminar partes de mis RewriteRule
declaraciones.
¿Alguien puede explicarme brevemente cómo implementarlo?
Gracias
.htaccess
mod-rewrite
alex
fuente
fuente
Respuestas:
En mis propias palabras, después de leer los documentos y experimentar:
Puede usar
RewriteBase
para proporcionar una base para sus reescrituras. Considera estoEsta es una regla real que utilicé para garantizar que las URL tengan una barra diagonal final. Esto convertirá
a
Al tener
RewriteBase
allí, hace que la ruta relativa salga delRewriteBase
parámetro.fuente
$1
coincide con el patrón RewriteRule entre paréntesis, pero la ruta relativa para la sustitución proviene del parámetro RewriteBase. Entonces, la sustitución resultante es/~new/$1/
.RewriteBase
directivas múltiples . En resumen, no puede tener más de uno: creo que la últimaRewriteBase
directiva gana y afecta a todo el archivo .htaccess.RewriteBase
para proporcionar una base para sus reescrituras" - que es prácticamente sólo una reordenación de las palabras - pero no tengo ni idea de lo que es una "base" es en este contexto, ni cómo el significado de la El ejemplo que ha dado sería diferente siRewriteBase
se eliminara la línea. Fuera del manual voy ...RewriteBase
solo se aplica al objetivo de una regla de reescritura relativa .Usando RewriteBase como este ...
es esencialmente lo mismo que ...
Pero cuando el archivo .htaccess está dentro
/folder/
, esto también apunta al mismo objetivo:Aunque los documentos implican siempre usar un
RewriteBase
, Apache generalmente lo detecta correctamente para las rutas bajo DocumentRoot a menos que:Estás usando
Alias
directivasEstá utilizando reglas de reescritura de .htaccess para realizar redireccionamientos HTTP (en lugar de solo una reescritura silenciosa) a URL relativas
En estos casos, puede encontrar que necesita especificar RewriteBase.
Sin embargo, dado que es una directiva confusa, generalmente es mejor simplemente especificar URI absolutos (también conocidos como 'raíz relativa') en sus objetivos de reescritura. Otros desarrolladores que lean sus reglas las comprenderán más fácilmente.
Citando la excelente respuesta en profundidad de Jon Lin aquí :
En un archivo .htaccess, mod_rewrite funciona de forma similar a una
<Directory>
o<Location>
contenedor. yRewriteBase
se usa para proporcionar una base de ruta relativa.Por ejemplo, supongamos que tiene esta estructura de carpetas:
Para que pueda acceder a:
http://example.com/
(raíz)http://example.com/subdir1
(subdir1)http://example.com/subdir2
(subdir2)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:/a/b/c/d
, entonces el URI capturado ($1
) esa/b/c/d
.subdir2
y la solicitud es/subdir2/e/f/g
entonces, el URI capturado ese/f/g
.subsubdir
, y la solicitud está/subdir2/subsubdir/x/y/z
, entonces el URI capturado está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 cómo funciona por directorio.
Lo que la base de reescritura no lo hacen, es proporcionar una base URL-path ( no una base file-path) de las rutas relativas en el objetivo de la regla . Digamos que tienes esta regla:
El
bar.php
es un camino relativo, en oposición a:donde el
/bar.php
es un camino absoluto. La ruta absoluta 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., la/bar.php
ruta siempre se asignahttp://example.com/bar.php
.Pero la otra regla, con la ruta relativa, se basa en el directorio en el que se encuentra la regla. Entonces, si
está en la "raíz" y vas a
http://example.com/foo
, te sirvenhttp://example.com/bar.php
. Pero si esa regla está en el directorio "subdir1", y usted vahttp://example.com/subdir1/foo
, se le serviráhttp://example.com/subdir1/bar.php
. etc. Esto a veces funciona y a veces no, como dice la documentación, se supone que es necesario para rutas relativas, pero la mayoría de las veces parece funcionar. Excepto cuando está redirigiendo (usando laR
bandera, o implícitamente porque tienehttp://host
en el objetivo de su regla). Eso significa esta regla:si está en el directorio "subdir2", y te vas a
http://example.com/subdir2/foo
, mod_rewrite confundirá la ruta relativa como un archivo de ruta en lugar de una dirección URL de la ruta y debido a laR
bandera, que va a terminar siendo redirigido a algo como:http://example.com/var/www/localhost/htdocs/subdir1
. Lo cual obviamente no es lo que quieres.Aquí es donde
RewriteBase
entra. La directiva le dice a mod_rewrite qué agregar al comienzo de cada ruta relativa. Entonces si tengo:en "subsubdir", ir 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 generalmente no es lo que desea, porque no puede tener múltiples bases en el mismo contenedor de directorio o archivo htaccess.En la mayoría de los casos, se usa así:
donde esas reglas estarían en el directorio "subdir1" y
estaría en el directorio "subsubdir".
Esto en parte le permite 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:
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/
a/subdir2/subsubdir/
, podría haber tenido una base:Y luego, cuando necesita mover esos archivos y las reglas a otro directorio, simplemente cambie la base:
y eso es.
fuente
RewriteEngine On
. No es necesario en 1 y 1, por ejemplo, pero es necesario en mi servidor dedicado.AFAIK, RewriteBase solo se usa para corregir casos en los que mod_rewrite se ejecuta en un
.htaccess
archivo que no está 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 un RewriteRule en un .htaccess en una carpeta que se asigna ahttp://example.com/myfolder
usted puede usar:Si mod_rewrite no funciona correctamente.
Tratar de usarlo para lograr algo inusual, en lugar de solucionar este problema, parece una receta para confundirse.
fuente
RewriteBase solo es útil en situaciones en las que solo puede poner un .htaccess en la raíz de su sitio. De lo contrario, es mejor que coloque sus diferentes archivos .htaccess en diferentes directorios de su sitio y omita por completo la directiva RewriteBase.
Últimamente, para sitios complejos, los he estado eliminando, porque hace que la implementación de archivos de prueba para vivir solo sea un paso más complicado.
fuente
Cuando desarrollo, está en un dominio diferente dentro de una carpeta. Cuando tomo un sitio en vivo, esa carpeta ya no existe. Usar RewriteBase me permite usar el mismo archivo .htaccess en ambos entornos.
Cuando vivir:
Al desarrollar:
fuente
%{REQUEST_URI}
en unaRewriteCond
directiva por ejemplo?La explicación más clara que encontré no estaba en los documentos actuales de 2.4 apache, sino en la versión 2.0 .
¿Como funciona? Para los piratas informáticos de Apache, este documento de 2.0 proporciona "información detallada sobre los pasos de procesamiento interno".
Lección aprendida: si bien debemos estar familiarizados con las "actuales", las gemas se pueden encontrar en los anales.
fuente
Este comando puede establecer explícitamente la URL base para sus reescrituras. Si desea comenzar en la raíz de su dominio, debe incluir la siguiente línea antes de su RewriteRule:
fuente
Creo que este extracto de la documentación de Apache complementa bien las respuestas anteriores:
fuente