Establezca RewriteBase en la ruta actual de la carpeta de forma dinámica

¿Hay alguna forma de establecer RewriteBase en la carpeta de ruta actual (la carpeta en la que se encuentra el archivo .htaccess) con respecto a la raíz del host?

Tengo un CMS y si lo muevo al directorio en mi host no funciona a menos que establezca RewriteBase en la ruta del directorio relativo a la raíz del host. Me gustaría que mi CMS funcione solo con copiar y pegar, sin cambiar ningún código en htaccess.

Actualizar:

Por ejemplo:

webroot - sub_directory - cms - .htaccess 

en este caso, debería escribir en htaccess: RwriteBase /

y si muevo el htaccess dentro de subdirectorio, debería cambiar RwriteBase a:

RewriteBase /sub_directory/

Entonces quiero algo como

RewriteBase /%{current_folder}/

Aquí hay una manera en que uno puede tomar RewriteBase en una variable de entorno que luego puede usar en sus otras reglas de reescritura:

 RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$ RewriteRule ^(.*)$ - [E=BASE:%1] 

Luego puede usar %{ENV:BASE} en sus reglas para denotar RewriteBase .

Explicación:

Esta regla funciona comparando REQUEST_URI con la ruta URL que RewriteRule ve, que es REQUEST_URI con la RewriteBase principal eliminada. La diferencia es RewriteBase y se pone en %{ENV:BASE} .

  • En un RewriteCond , el LHS (cadena de prueba) puede usar variables de referencia RewriteCond , por ejemplo $1 , $2 O %1 , %2 etc. pero el lado RHS es decir cadena de condiciones no puede usar estas variables $1 , $2 OR %1 , %2 .
  • Dentro de la parte de la condición RHS, solo la referencia posterior que podemos usar son referencias internas internas, es decir, los grupos que hemos capturado en esta condición. Se denotan por \1 , \2 etc.
  • En RewriteCond primer grupo capturado es (.*?/) . Se representará mediante una referencia posterior interna `\ 1.
  • Como puede observar, esta regla básicamente busca RewriteBase dinámicamente al comparar %{REQUEST_URI} y $1 . Un ejemplo de %{REQUEST_URI} será /directory/foobar.php y un ejemplo de $1 para el mismo URI de ejemplo será foobar.php . ^(.*?/)(.*)::\2$ está poniendo la diferencia en el primer grupo capturado %1 o \1 . Para nuestro ejemplo, poblará %1 o \1 con el valor /directory/ que se usará más adelante en la configuración de la variable env %{BASE} es decir, E=BASE:%1 .

La solución aceptada no funcionó para mí, creo, pero sí: http://www.zeilenwechsel.de/it/articles/8/Using-mod_rewrite-in-.htaccess-files-without-knowing-the-RewriteBase .html

Larga historia corta:

 RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$ RewriteRule ^.*$ %2index.php [QSA,L] 

Basándome en la respuesta de anubhava y en la de Jon Lin , esto es lo que acabo de plantearme por mí mismo (no lo he usado en producción ni he probado esto extensamente todavía).

Usemos esta URL de ejemplo, donde .htaccess está en la carpeta_actual:

http://localhost/path_to/current_folder/misc/subdir/file.xyz

Sistema de archivos: /var/www/webroot/path_to/current_folder/.htaccess

 Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteCond %{ENV:SUBPATH} ^$ # Check if variable is empty. If it is, process the next rule to set it. RewriteRule ^(.*)$ - [ENV=SUBPATH:$1] # SUBPATH is set to 'misc/subdir/file.xyz' RewriteCond %{ENV:CWD} ^$ RewriteCond %{ENV:SUBPATH}::%{REQUEST_URI} ^(.*)::(.*?)\1$ RewriteRule ^ - [ENV=CWD:%2] # CWD is set to '/path_to/current_folder/' RewriteCond %{ENV:FILENAME} ^$ RewriteCond %{REQUEST_URI} ^.*/(.*)$ RewriteRule ^ - [ENV=FILENAME:%1] # FILENAME is set to 'file.xyz' # Check if /var/www/webroot/path_to/current_folder/misc/subdir/file.xyz exists. # -f checks if a file exists, -d checks for a directory. # If it exists, rewrite to /path_to/current_folder/misc/subdir/file.xyz and stop processing rules. RewriteCond %{ENV:SUBPATH} ^.+$ # Ensure SUBPATH is not empty RewriteCond %{DOCUMENT_ROOT}%{ENV:CWD}%{ENV:SUBPATH} -f [OR] RewriteCond %{DOCUMENT_ROOT}%{ENV:CWD}%{ENV:SUBPATH} -d RewriteRule ^.*$ %{ENV:CWD}%{ENV:SUBPATH} [END] # Check if /var/www/webroot/path_to/current_folder/file.xyz exists. # If it exists, rewrite to /path_to/current_folder/file.xyz and stop processing rules. RewriteCond %{ENV:FILENAME} ^.+$ RewriteCond %{DOCUMENT_ROOT}%{ENV:CWD}%{ENV:FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}%{ENV:CWD}%{ENV:FILENAME} -d RewriteRule ^.*$ %{ENV:CWD}%{ENV:FILENAME} [END] # Else, rewrite to /path_to/current_folder/index.html and stop processing rules. RewriteRule ^.*$ %{ENV:CWD}index.html [END] 

Puede ver los detalles de lo que está sucediendo para usted usando la LogLevel alert rewrite:trace6 en su httpd.conf en apache, y luego buscando en su error.log .

Aquí hay un poco más de aclaración sobre las dos líneas siguientes, que todavía me resultaba un poco confuso.

 RewriteCond %{ENV:SUBPATH}::%{REQUEST_URI} ^(.*)::(.*?)\1$ RewriteRule ^ - [ENV=CWD:%2] 

En primer lugar, el doble colon :: no es un operador de ningún tipo; es solo un delimitador arbitrario. RewriteCond expande TestString %{ENV:SUBPATH}::%{REQUEST_URI} a lo siguiente:

misc/subdir/file.xyz::/path_to/current_folder/misc/subdir/file.xyz

Entonces nuestro CondPattern ^(.*)::(.*?)\1$ :

  1. ^(.*):: coincide con misc/subdir/file.xyz::
  2. \1 es el primer grupo de captura, misc/subdir/file.xyz
  3. (.*?)\1$ convierte en (.*?)misc/subdir/file.xyz$
  4. Por lo tanto, nuestro segundo grupo de captura (.*?) /path_to/current_folder/ restante

Y nuestra RewriteRule establece CWD en %2 , que es el segundo grupo de captura de CondPattern.