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.
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
.
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}
.
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
. \1
, \2
etc. RewriteCond
premier groupe capturé est (.*?/)
. Il sera représenté par une référence interne interne `\ 1. 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$
:
^(.*)::
correspond à misc/subdir/file.xyz::
\1
est le premier groupe de capture, misc/subdir/file.xyz
(.*?)\1$
devient (.*?)misc/subdir/file.xyz$
(.*?)
/path_to/current_folder/
Et notre RewriteRule
définit CWD
sur %2
, qui est le deuxième groupe de capture de CondPattern.