web-dev-qa-db-fra.com

Comment ignorer un répertoire dans mod_rewrite?

J'essaie d'avoir les règles de modrewrite ignorer le répertoire vip. J'ai essayé un certain nombre de choses comme vous pouvez le voir ci-dessous, mais en vain.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#RewriteRule ^vip$ - [PT]
RewriteRule ^vip/.$ - [PT]
#RewriteCond %{REQUEST_URI} !/vip 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Comment faire pour que modrewrite ignore complètement le /vip/ répertoire pour que toutes les demandes passent directement dans le dossier?

Mise à jour:

Pour plus de clarté:

  • Il est hébergé sur Dreamhost
  • Les dossiers se trouvent dans un répertoire wordpress
  • le dossier/vip/contient un webhtav .htaccess etc (bien que je ne pense pas que ce soit important
73
user24557

Essayez de mettre cela avant toute autre règle.

RewriteRule ^vip - [L,NC] 

Il correspondra à tout URI commençant par vip.

  • Le - Signifie ne rien faire.
  • L signifie que cela devrait être la dernière règle; ignorer tout ce qui suit.
  • NC signifie pas de casse (donc "VIP" est également mis en correspondance).

Notez qu'il correspond à n'importe quoi débutvip. L'expression ^vip$ Correspondrait à vip mais pas à vip/ Ni à vip/index.html. Le $ A peut-être été votre perte. Si vous voulez vraiment le faire correctement, vous voudrez peut-être utiliser ^vip(/|$) pour ne pas faire correspondre vip-page.html

127
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Cela signifie que s'il s'agit d'un fichier existant ou d'un répertoire, ne le touchez pas. Vous devriez pouvoir accéder à site.com/vip et aucune règle de réécriture ne devrait avoir lieu.

14
steve

Le code que vous ajoutez et toutes les réponses qui fournissent des règles/conditions de réécriture sont inutiles! Le code par défaut WordPress fait déjà tout ce dont vous avez besoin pour:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ces lignes indiquent "s'il ne s'agit PAS d'un fichier existant (-f) ou répertoire (-d), transmettez-le à WordPress. L'ajout de règles supplémentaires, qu'elles soient spécifiques ou bonnes, est redondant - vous devriez déjà être couvert par les règles WordPress!

Alors pourquoi ne travaillent-ils pas ???

Le .htaccess dans le répertoire vip génère une erreur. La même chose se produit si votre mot de passe protège un répertoire.

Voici la solution:

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

Insérez ces lignes avant le code WordPress, puis créez /err.txt. De cette façon, quand il arrive sur votre WebDAV (ou répertoire protégé par mot de passe) et échoue, il ira dans ce fichier, et se faire prendre par la condition par défaut WordPress condition (RewriteCond %{REQUEST_FILENAME} !-f).

10
brentonstrine

En résumé, la solution finale est:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

J'ai posté plus sur la cause de ce problème dans ma situation spécifique, impliquant Wordpress et WebDAV sur Dreamhost, que j'attends de beaucoup d'autres sur mon site .

9
Cody A. Ray

Vous avez mentionné que vous avez déjà un fichier .htaccess dans le répertoire que vous souhaitez ignorer - vous pouvez utiliser

RewriteEngine off

Dans ce .htaccess pour arrêter l'utilisation de mod_rewrite (vous ne savez pas si vous utilisez mod_rewrite dans ce dossier, si vous l'êtes, cela ne vous aidera pas car vous ne pouvez pas le désactiver).

8
Jay

Essayez de remplacer cette partie de votre code:

RewriteRule ^ vip /.$ - [PT]

... avec ce qui suit:

RewriteCond% {REQUEST_URI}! (Vip) [NC]

Cela devrait arranger les choses.

6
ChongFury
RewriteCond %{REQUEST_URI} !^pilot/ 

est le moyen de le faire.

4
Gokul Muralidharan

J'ai rencontré le même problème en utilisant wordpress et j'ai constaté que le problème est lié au fait de ne pas avoir de gestionnaire approprié pour les erreurs 401 et 403 ..

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Ces conditions sont déjà censées ne pas réécrire l'URL des dossiers existants, mais elles ne font pas leur travail pour les dossiers protégés par mot de passe. Dans mon cas, l'ajout des deux lignes suivantes à mon .htaccess racine a résolu le problème:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

Bien sûr, vous devez créer le fichier /misc/myerror.html,

3
matdumsa

Cela marche ...

RewriteRule ^vip - [L,NC]

Mais assurez-vous que c'est la première règle après

RewriteEngine sur

c'est à dire.

ErrorDocument 404 /page-not-found.html

RewriteEngine on

RewriteRule ^vip - [L,NC]

AddType application/x-httpd-php .html .htm

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

etc
3
Pat

Dans mon cas, la réponse de brentonstrine (et je vois matdumsa avait également la même idée) était la bonne ... Je voulais voter pour leurs réponses, mais étant nouveau ici, je n'ai pas de "réputation", donc je dois écrire une réponse complète, afin de souligner ce que je pense être la vraie clé ici.

Plusieurs de ces réponses empêcheraient avec succès l'utilisation de WordPress index.php ... mais dans de nombreux cas, la raison en est qu'il existe un vrai répertoire contenant de vraies pages que vous souhaitez afficher directement, et

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

les lignes s'en occupent déjà, donc la plupart de ces solutions sont une distraction dans un cas comme le mien.

La clé était celle de brentonstrine un aperçu que l'erreur était un effet secondaire, provoqué par la protection par mot de passe dans le répertoire que j'essayais d'afficher directement. En mettant le

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

lignes et création de pages d'erreur (j'ai en fait créé err401.html et err403.html et créé des messages d'erreur plus informatifs) comme prévu ... montrant une boîte de dialogue de connexion Apache, puis le contenu du dossier, ou en cas d'échec, ma page d'erreur 401.

2
carlaron