.htaccess RewriteRule - DOCUMENT_ROOT et RewriteBase
J'ai un secure/ sous-répertoire avec plusieurs fichiers que je veux effectuer de simples RewriteRules juste à défaut d'une extension PHP. J'ai eu du mal à faire ces travaux, et après quelques essais et erreurs tombé sur le suivant.
RewriteEngine On
RewriteBase /secure
# Force PHP extension if not a directory
RewriteCond %{DOCUMENT_ROOT}/secure/%{REQUEST_URI} -d
RewriteRule ^(.*)$ - [L]
RewriteCond %{DOCUMENT_ROOT}/secure/$1.php -f
RewriteRule ^((.*/)*[^./]+)/*$ $1.php [L]
Mon manque de compréhension est autour de %{DOCUMENT_ROOT}
et en ajoutant /secure/
. J'ai cru %{DOCUMENT_ROOT}
ou à l'aide de la RewriteBase
serait en mesure de gérer cela. Toutefois, chacune de ces pièces semble être nécessaire. J'aimerais savoir pourquoi et ce que chacun réalise dans mon cas.
Vous devez vous connecter pour publier un commentaire.
La Directive RewriteBase est utilisé par mod_rewrite exclusivement lors de la redirection étapes, et est ignoré lors de tous les autres traitements. Contrairement à ce que les états de documentation, il n'est souvent pas nécessaire, puisque (comme dans votre cas), il est assez commun pour l'URL de la carte de sous-répertoires dans le système de fichiers au-delà de la
DOCUMENT_ROOT
.Donc, en quoi la directive faire? Lorsque vos règles sont en cours d'évaluation dans un contexte de répertoire, comme ils le sont lors de l'utilisation d'un .fichier htaccess, l'URL est passée à mod_rewrite très en retard dans le traitement de la demande de la chaîne. Cela signifie que l'URL peut-être déjà été partiellement traduit en un chemin du système de fichiers, donc un chemin dans /répertoire/sous-répertoire/fichier il aurait peut-être accessible par le serveur web via /location/sous-répertoire/fichier.
Cela ne semble pas être un problème, mais le fait que le /emplacement/ morceau a été perdu pose un problème pour le mod_rewrite. Pour comprendre pourquoi, vous devez savoir comment mod_rewrite rend un contexte de répertoire, de réécriture possible.
Lorsque vous procédez à la réécriture dans un .fichier htaccess, mod_rewrite réinjecte de la modification de la demande dans Apache comme une redirection interne, comme si c'était une URL. C'est problématique, car le chemin de la requête peut ne pas être une URL pour passer. Par exemple, si la demande est terminé à /répertoire/sous-répertoire/fichier (que nous supposerons est en dehors de la
DOCUMENT_ROOT
), on pourrait avoir cette règle dans /annuaire/.htaccess:Ce serait d'examiner /sous-répertoire/fichier, décider qu'il n'était pas un vrai fichier, et de le réécrire à index.php. À ce moment, une nouvelle URL doit être remis à Apache pour la redirection interne pour finaliser la réécriture. Depuis, il n'a pas de point de référence, il finit par l'envoi de l'ensemble du chemin—qui est, il envoie /directory/index.php. Ce n'est pas ce que vous voulez, puisque l'URL pour accéder à cet endroit serait effectivement /location/index.php. C'est là que la directive RewriteBase est en. En spécifiant
dans le .fichier htaccess, le répertoire préfixe /annuaire/ serait échangé pour /emplacement/ dans le cadre de ce post-réécriture de traitement, résultant en une redirection interne à prévu URL /location/index.php.
Cela a aussi des implications avec les redirections externes ainsi. Si vous essayez de l'extérieur de redirection à l'aide de la
[R]
drapeau avec juste un chemin, et le chemin n'est pas un slash, l'ensemble du répertoire sera envoyé au client dans les conditions décrites ci-dessus, sauf si elle est remplacée par la valeur donnée dans la directive RewriteBase.Aucun de ces points semblent pertinents à votre situation, donc vous devriez être fine, sans préciser le RewriteBase.
La
%{DOCUMENT_ROOT}
variable est simplement la valeur de Apache interneDOCUMENT_ROOT
variable, qui est mis à votre serveur/configuration d'un hôte virtuel. Il correspond toujours à l'annuaire qu'une demande de / résout. Le-f
et-d
vérifie exigent un chemin du système de fichiers, c'est pourquoi%{DOCUMENT_ROOT}
besoins à ajouter le chemin d'accès relatif lors de leur utilisation.Pour résoudre le chemin de la demande actuelle cependant, mod_rewrite prend soin de cela pour vous avec le
%{REQUEST_FILENAME}
variable. Par exemple, en supposant que l' .fichier htaccess vie dans votre /secure sous-répertoire, vous pouvez modifier votre règle définie comme suit: