Je l'ai vu dans quelques .htaccess
exemples
RewriteBase /
Il semble être quelque peu similaire en termes de fonctionnalités à celui <base href="">
de HTML.
Je pense qu'il peut ajouter automatiquement sa valeur au début de RewriteRule
déclarations (éventuellement celles sans barre oblique)?
Je ne pouvais pas le faire fonctionner correctement. Je pense que son utilisation pourrait être très utile pour la portabilité du site, car j'ai souvent un serveur de développement différent de celui de production. Ma méthode actuelle me laisse supprimer des parties de monRewriteRule
relevés.
Quelqu'un peut-il m'expliquer brièvement comment le mettre en œuvre?
Merci
Réponses:
Dans mes propres mots, après avoir lu les documents et expérimenté:
Vous pouvez utiliser
RewriteBase
pour fournir une base pour vos réécritures. Considère ceciC'est une vraie règle que j'ai utilisée pour m'assurer que les URL ont une barre oblique de fin. Cela convertira
à
En ayant
RewriteBase
là, vous faites sortir le chemin relatif duRewriteBase
paramètre.la source
$1
correspond au modèle RewriteRule entre parenthèses, mais le chemin relatif pour la substitution se détache du paramètre RewriteBase. Ainsi, la substitution résultante est/~new/$1/
.RewriteBase
directives. En bref, vous ne pouvez pas en avoir plus d'un - je pense que la dernièreRewriteBase
directive l'emporte et affecte tout le fichier .htaccess.RewriteBase
pour fournir une base pour vos réécritures" - c'est à peu près juste un réarrangement des mots - mais je n'ai aucune idée de ce qu'une "base" est dans ce contexte, ni comment le sens de la l'exemple que vous avez donné serait différent si laRewriteBase
ligne était supprimée. Je vais au manuel ...RewriteBase
n'est appliqué qu'à la cible d'une règle de réécriture relative .Utiliser RewriteBase comme ceci ...
est essentiellement le même que ...
Mais lorsque le fichier .htaccess est à l'intérieur,
/folder/
cela pointe également vers la même cible:Bien que les documents impliquent toujours d'utiliser un
RewriteBase
, Apache le détecte généralement correctement pour les chemins sous DocumentRoot, sauf si:Vous utilisez des
Alias
directivesVous utilisez des règles de réécriture .htaccess pour effectuer des redirections HTTP (plutôt qu'une réécriture silencieuse) vers des URL relatives
Dans ces cas, vous pouvez constater que vous devez spécifier la RewriteBase.
Cependant, comme il s'agit d'une directive déroutante, il est généralement préférable de simplement spécifier des URI absolus (aka 'root relative') dans vos cibles de réécriture. Les autres développeurs lisant vos règles les comprendront plus facilement.
Citant ici l'excellente réponse détaillée de Jon Lin :
Dans un fichier htaccess, mod_rewrite fonctionne comme un
<Directory>
ou<Location>
conteneur. et leRewriteBase
est utilisé pour fournir une base de chemin relatif.Par exemple, supposons que vous ayez cette structure de dossiers:
Vous pouvez donc accéder à:
http://example.com/
(racine)http://example.com/subdir1
(subdir1)http://example.com/subdir2
(subdir2)http://example.com/subdir2/subsubdir
(subsubdir)L'URI qui est envoyé via un
RewriteRule
est relatif au répertoire contenant le fichier htaccess. Donc si vous avez:/a/b/c/d
, puis l'URI capturé ($1
) esta/b/c/d
.subdir2
et que la demande est/subdir2/e/f/g
l'URI capturé l'este/f/g
.subsubdir
, et que la demande l'est/subdir2/subsubdir/x/y/z
, l'URI capturé l'estx/y/z
.Le répertoire dans lequel se trouve la règle a cette partie supprimée de l'URI. La base de réécriture n'a aucun effet sur cela, c'est simplement comment fonctionne le répertoire.
Qu'est - ce que la base de réécriture ne fait, est de fournir une base chemin URL ( pas pour tous les chemins relatifs à la base-chemin du fichier) cible de règle . Alors disons que vous avez cette règle:
Le
bar.php
est un chemin relatif, par opposition à:où le
/bar.php
est un chemin absolu. Le chemin absolu sera toujours la "racine" (dans la structure de répertoires ci-dessus). Cela signifie que, indépendamment du fait que la règle se trouve dans la "racine", "subdir1", "subsubdir", etc., le/bar.php
chemin correspond toujours àhttp://example.com/bar.php
.Mais l'autre règle, avec le chemin relatif, elle est basée sur le répertoire dans lequel se trouve la règle. Donc, si
est dans la "racine" et vous allez
http://example.com/foo
, vous êtes servihttp://example.com/bar.php
. Mais si cette règle se trouve dans le répertoire "subdir1" et que vous y accédezhttp://example.com/subdir1/foo
, vous êtes servihttp://example.com/subdir1/bar.php
. etc. Cela fonctionne parfois et parfois non, comme le dit la documentation, il est censé être requis pour les chemins relatifs, mais la plupart du temps cela semble fonctionner. Sauf lorsque vous redirigez (en utilisant l'R
indicateur, ou implicitement parce que vous avezhttp://host
dans la cible de votre règle). Cela signifie que cette règle:s'il se trouve dans le répertoire "subdir2" et que vous y accédez
http://example.com/subdir2/foo
, mod_rewrite confondra le chemin d'accès relatif avec un chemin de fichier au lieu d'un chemin d'URL et à cause de l'R
indicateur, vous finirez par être redirigé vers quelque chose comme:http://example.com/var/www/localhost/htdocs/subdir1
. Ce qui n'est évidemment pas ce que vous voulez.C'est là
RewriteBase
qu'intervient. La directive indique à mod_rewrite quoi ajouter au début de chaque chemin relatif. Donc si j'ai:dans "subsubdir", aller à
http://example.com/subdir2/subsubdir/foo
vraiment me servirhttp://example.com/blah/bar.php
. Le "bar.php" est ajouté à la fin de la base. Dans la pratique, cet exemple n'est généralement pas ce que vous voulez, car vous ne pouvez pas avoir plusieurs bases dans le même conteneur de répertoire ou fichier htaccess.Dans la plupart des cas, il est utilisé comme ceci:
où ces règles seraient dans le répertoire "subdir1" et
serait dans le répertoire "subsubdir".
Cela vous permet en partie de rendre vos règles portables, vous pouvez donc les déposer dans n'importe quel répertoire et ne devez changer la base qu'au lieu d'un tas de règles. Par exemple, si vous aviez:
de telle sorte que va
http://example.com/subdir1/foo
servirhttp://example.com/subdir1/bar.php
etc. Et disons que vous avez décidé de déplacer tous ces fichiers et règles dans le répertoire "subsubdir". Au lieu de changer chaque instance de/subdir1/
en/subdir2/subsubdir/
, vous auriez pu simplement avoir une base:Et puis, lorsque vous avez dû déplacer ces fichiers et les règles vers un autre répertoire, changez simplement la base:
et c'est tout.
la source
RewriteEngine On
. Pas besoin sur 1and1 par exemple mais c'est obligatoire sur mon serveur dédié.AFAIK, RewriteBase est uniquement utilisé pour corriger les cas où mod_rewrite s'exécute dans un
.htaccess
fichier ne se trouvant pas à la racine d'un site et il devine le mauvais chemin Web (par opposition au chemin du système de fichiers) pour le dossier dans lequel il s'exécute. Donc, si vous avez un RewriteRule dans un .htaccess dans un dossier quihttp://example.com/myfolder
vous correspond peut utiliser:Si mod_rewrite ne fonctionne pas correctement.
Essayer de l'utiliser pour réaliser quelque chose d'inhabituel, plutôt que de résoudre ce problème, ressemble à une recette pour devenir très confus.
la source
RewriteBase n'est utile que dans les situations où vous ne pouvez mettre qu'un .htaccess à la racine de votre site. Sinon, vous feriez mieux de placer vos différents fichiers .htaccess dans différents répertoires de votre site et d'omettre complètement la directive RewriteBase.
Dernièrement, pour les sites complexes, je les ai supprimés, car cela complique le déploiement de fichiers de test pour vivre.
la source
Quand je développe, c'est sur un domaine différent dans un dossier. Lorsque je mets un site en ligne, ce dossier n'existe plus. L'utilisation de RewriteBase me permet d'utiliser le même fichier .htaccess dans les deux environnements.
En direct:
Lors du développement:
la source
%{REQUEST_URI}
uneRewriteCond
directive par exemple?L'explication la plus claire que j'ai trouvée n'était pas dans la documentation actuelle d'Apache 2.4, mais dans la version 2.0 .
Comment ça marche? Pour vous les hackers apache, ce document 2.0 continue de donner "des informations détaillées sur les étapes de traitement internes".
Leçon apprise: Bien que nous ayons besoin de nous familiariser avec le "courant", des gemmes peuvent être trouvées dans les annales.
la source
Cette commande peut définir explicitement l'URL de base pour vos réécritures. Si vous souhaitez commencer à la racine de votre domaine, vous devez inclure la ligne suivante avant votre RewriteRule:
la source
Je pense que cet extrait de la documentation Apache complète bien les réponses précédentes:
la source