.htaccess - redireccionar - rewritecond htaccess
¿Cómo funciona RewriteBase en.htaccess? (8)
He visto esto en algunos ejemplos .htaccess
RewriteBase /
Parece tener una funcionalidad similar a la <base href="">
de HTML.
¿Creo que puede añadir automáticamente su valor al comienzo de RewriteRule
declaraciones de RewriteRule
(posiblemente una sin barra diagonal)?
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 al de producción. Mi método actual me RewriteRule
eliminar partes de mis declaraciones de RewriteRule
.
¿Alguien me puede explicar brevemente cómo implementarlo?
Gracias
AFAIK, RewriteBase solo se usa para corregir los casos en los que mod_rewrite se ejecuta en un archivo .htaccess
que no se encuentra 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. tenga una RewriteRule en un .htaccess en una carpeta que se asigna a http://example.com/myfolder
que puede usar:
RewriteBase myfolder
Si mod_rewrite no está funcionando correctamente.
Tratar de usarlo para lograr algo inusual, en lugar de solucionar este problema, parece una receta para confundirse.
Creo que este extracto de la documentación de Apache, complementa bien las respuestas anteriores:
Esta directiva es necesaria cuando se usa una ruta relativa en una sustitución en el contexto de directorio (htaccess) a menos que se cumpla alguna de las siguientes condiciones:
La solicitud original, y la sustitución, están debajo de DocumentRoot (en lugar de ser accesibles por otros medios, como Alias).
La ruta del sistema de archivos al directorio que contiene la RewriteRule, con el sufijo de la sustitución relativa, también es válida como una ruta URL en el servidor (esto es raro).
Como se mencionó anteriormente, en otros contextos, solo es útil hacer su regla más corta. Además, también como se mencionó anteriormente, puede lograr lo mismo colocando el archivo htaccess en el subdirectorio.
Cuando me desarrollo, está en un dominio diferente dentro de una carpeta. Cuando tomo un sitio en vivo, esa carpeta ya no existe. El uso de RewriteBase me permite usar el mismo archivo .htaccess en ambos entornos.
Cuando vivo
RewriteBase /
# RewriteBase /dev_folder/
Al desarrollar:
# RewriteBase /
RewriteBase /dev_folder/
En mis propias palabras, después de leer los documentos y experimentar:
Puede utilizar RewriteBase
para proporcionar una base para sus 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 garantizar que las URL tengan una barra inclinada al final. Esto convertirá
http://www.example.com/~new/page
a
http://www.example.com/~new/page/
Al tener la RewriteBase
allí, hace que la ruta relativa salga del parámetro RewriteBase
.
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:
RewriteBase /
La explicación más clara que encontré no estaba en los documentos 2.4 apache actuales, sino en la versión 2.0 .
# /abc/def/.htaccess -- per-dir config file for directory /abc/def
# Remember: /abc/def is the physical path of /xyz, i.e., the server
# has a ''Alias /xyz /abc/def'' directive e.g.
RewriteEngine On
# let the server know that we were reached via /xyz and not
# via the physical path prefix /abc/def
RewriteBase /xyz
¿Como funciona? Para los piratas informáticos de apache, este documento 2.0 continúa proporcionando "información detallada sobre los pasos de procesamiento interno".
Lección aprendida: Si bien debemos estar familiarizados con las "actuales", se pueden encontrar gemas en los anales.
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 eliminado, porque hace que la implementación de archivos desde las pruebas a la vida sea solo un paso más complicado.
RewriteBase
solo se aplica al objetivo de una regla de reescritura relativa .
Usando RewriteBase de esta manera ...
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 de
/folder/
, esto también apunta al mismo objetivo:RewriteRule a/.html b.html
Aunque los documentos implican siempre usar una RewriteBase
, Apache generalmente lo detecta correctamente para las rutas bajo DocumentRoot a menos que:
Estás usando directivas de
Alias
Está utilizando las reglas de reescritura de .htaccess para realizar redirecciones HTTP (en lugar de solo reescritura silenciosa) a direcciones URL relativas
En estos casos, es posible que necesite especificar la RewriteBase.
Sin embargo, dado que es una directiva confusa, en general es mejor simplemente especificar URI absolutos (también conocidos como "relativos a la raíz") en sus objetivos de reescritura. Otros desarrolladores que lean tus reglas lo 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 contenedor <Directory>
o <Location>
. y la httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase se utiliza para proporcionar una base de ruta relativa.
Por ejemplo, digamos que tienes esta estructura de carpetas:
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
Para que puedas acceder a:
-
http://example.com/
(root) -
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 RewriteRule
es relativo al directorio que contiene el archivo htaccess. Así que si tienes:
RewriteRule ^(.*)$ -
- En la raíz htaccess, y la solicitud es
/a/b/c/d
, entonces 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 de la URI. La base de reescritura no tiene ningún efecto en esto, esto es simplemente cómo funciona por directorio.
Lo que hace la base de reescritura es proporcionar una base de ruta de URL ( no una base de ruta de archivo) para cualquier ruta relativa en el destino de la regla . Así que di que tienes esta regla:
RewriteRule ^foo$ bar.php [L]
El bar.php
es una ruta relativa, a diferencia de:
RewriteRule ^foo$ /bar.php [L]
donde el /bar.php
es una ruta absoluta. La ruta absoluta siempre será la "raíz" (en la estructura de directorios de arriba). Eso significa que, independientemente de si la regla está en la "raíz", "subdir1", "subsubdir", etc., la ruta /bar.php
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. Entonces, si
RewriteRule ^foo$ bar.php [L]
está en la "raíz" y usted va a http://example.com/foo
, recibe servicio http://example.com/bar.php
. Pero si esa regla está en el directorio "subdir1", y usted va a http://example.com/subdir1/foo
, se le sirve http://example.com/subdir1/bar.php
. Esto a veces funciona y otras no, como dice la documentación, se supone que se requiere para rutas relativas, pero la mayoría de las veces parece funcionar. Excepto cuando está redirigiendo (usando la marca R
, o implícitamente porque tiene http://host
en el destino de su regla). Eso significa esta regla:
RewriteRule ^foo$ bar.php [L,R]
Si está en el directorio "subdir2", y va a http://example.com/subdir2/foo
, mod_rewrite confundirá la ruta relativa con una ruta de archivo en lugar de una ruta URL y debido a la marca R
, Terminaré siendo redirigido a algo como: http://example.com/var/www/localhost/htdocs/subdir1
. Que obviamente no es lo que quieres.
Aquí es donde entra RewriteBase
. La directiva le dice a mod_rewrite qué debe agregar al comienzo de cada ruta relativa. Así que si tengo:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
en "subsubdir", ir a http://example.com/subdir2/subsubdir/foo
realidad 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 quiere, 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".
En parte, esto 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 conjunto 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]
...
de modo que ir a http://example.com/subdir1/foo
servirá a http://example.com/subdir1/bar.php
etc. Y diga 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:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
Y luego, cuando necesitabas mover esos archivos y las reglas a otro directorio, simplemente cambia la base:
RewriteBase /subdir2/subsubdir/
y eso es.