Définir RewriteBase sur le chemin du dossier en cours dynamicment

Est-il possible de définir RewriteBase sur le dossier path actuel (le dossier dans lequel se trouve le fichier .htaccess) par rapport à la racine de l’hôte?

J’ai un CMS et si je le déplace dans le répertoire de mon hôte, cela ne fonctionne pas à moins que je mette le RewriteBase sur le chemin du répertoire par rapport à la racine de l’hôte. Je voudrais que mon CMS ne fonctionne qu’avec copier-coller, sans changer de code dans htaccess.

Mettre à jour:

Par exemple:

webroot - sub_directory - cms - .htaccess 

dans ce cas je devrais écrire dans le htaccess: RwriteBase /

et si je déplace le htaccess dans le sous-répertoire, je devrais changer RwriteBase pour:

RewriteBase /sub_directory/

Donc je veux quelque chose comme

RewriteBase /%{current_folder}/

Voici un moyen de saisir la RewriteBase dans une variable d’environnement que vous pouvez ensuite utiliser dans vos autres règles de réécriture:

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

Vous pouvez ensuite utiliser %{ENV:BASE} dans vos règles pour indiquer RewriteBase .

Explication:

Cette règle fonctionne en comparant REQUEST_URI au chemin d’URL RewriteRule par RewriteRule , qui correspond à REQUEST_URI avec la RewriteBase principale supprimée. La différence est la RewriteBase et est placée dans %{ENV:BASE} .

  • Dans un RewriteCond , le LHS (chaîne de test) peut utiliser des variables de référence arrière, par exemple $1 , $2 OU %1 , %2 etc., mais ne peut pas utiliser ces variables $1 , $2 OU %1 , %2 .
  • A l’intérieur de la partie condition RHS, seule la référence arrière que nous pouvons utiliser est une référence interne, c’est-à- dire les groupes que nous avons capturés dans cette condition elle-même. Ils sont désignés par \1 , \2 etc.
  • Dans le RewriteCond premier groupe capturé est (.*?/) . Il sera représenté par une référence interne interne `\ 1.
  • Comme vous pouvez le constater, cette règle consiste essentiellement à trouver RewriteBase manière dynamic en comparant %{REQUEST_URI} et $1 . Un exemple de %{REQUEST_URI} sera /directory/foobar.php et l’exemple de $1 pour le même exemple d’URI sera foobar.php . ^(.*?/)(.*)::\2$ met la différence dans le premier groupe capturé %1 ou \1 . Pour notre exemple, il va renseigner %1 ou \1 avec la valeur /directory/ qui sera utilisé plus tard pour configurer la variable env %{BASE} c’est-à-dire E=BASE:%1 .

Je pense que la solution acceptée ne fonctionnait pas pour moi, mais cela a fonctionné: http://www.zeilenwechsel.de/it/articles/8/Using-mod_rewrite-in-.htaccess-files-without-knowing-the-RewriteBase .html

Longue histoire courte:

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

En me basant sur la réponse d’Anubhava et celle de Jon Lin , voici ce que je viens de proposer pour moi-même (je ne l’ai pas encore utilisé en production et je ne l’ai pas encore beaucoup testé).

Utilisons cet exemple d’URL, où .htaccess se trouve dans current_folder:

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

Système de fichiers: /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] 

Vous pouvez afficher les détails de ce qui se passe en utilisant l’ LogLevel alert rewrite:trace6 dans votre httpd.conf dans apache, puis en regardant dans votre error.log .

Voici un peu plus de précision sur les deux lignes suivantes, que je trouvais encore un peu déroutant.

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

Tout d’abord, le double-point :: n’est pas un opérateur d’aucune sorte; c’est juste un délimiteur arbitraire. Le RewriteCond étend TestSsortingng %{ENV:SUBPATH}::%{REQUEST_URI} à la suivante:

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

Puis notre CondPattern ^(.*)::(.*?)\1$ :

  1. ^(.*):: correspond à misc/subdir/file.xyz::
  2. \1 est le premier groupe de capture, misc/subdir/file.xyz
  3. (.*?)\1$ devient (.*?)misc/subdir/file.xyz$
  4. Ainsi, notre deuxième groupe de capture (.*?) /path_to/current_folder/

Et notre RewriteRule définit CWD sur %2 , qui est le deuxième groupe de capture de CondPattern.