Environnement : la version de nginx est la 1.2.6
Récemment, j'ai rencontré un problème étrange en travaillant sur un projet. Parce que je voulais repenser l'URL, j'ai utilisé les règles de réécriture nginx suivantes :
if (-f $request_filename/index.html){ rewrite (.*) /index.html break; } if (-f $request_filename/index.php){ rewrite (.*) /index.php; } if (!-f $request_filename){ rewrite (.*) /index.php; }
Cette règle de réécriture a été couramment utilisée. Je ne sais pas s'il y a quelque chose qui ne va pas ~ (veuillez me donner quelques conseils)
Lorsque je n'utilisais pas ces règles, une barre oblique était automatiquement ajoutée lors de l'accès à un répertoire existant sur le serveur. À ce moment-là, les règles de réécriture automatique de nginx étaient déclenchées. C'est normal et sans problème.
Mais après avoir ajouté les règles ci-dessus, les barres obliques ne seront pas automatiquement ajoutées lors de l'accès aux dossiers qui existent déjà sur le serveur. De plus, après des tests répétés, j'ai constaté que les 2ème et 3ème règles posaient des problèmes :
.1. Si vous supprimez uniquement la deuxième règle, peu importe si votre dossier existe ou non, il sera détecté comme inexistant, et aucune barre oblique ne sera ajoutée, et il entrera directement dans la troisième règle, et correspondra finalement à l'index. .php On voit qu'à ce moment, il est traité par fichier.
2. Si la deuxième règle est supprimée, la troisième règle détermine le fichier -f
改为 -e
, c'est-à-dire le fichier ou le dossier :
if (!-e $request_filename){ rewrite (.*) /index.php; }
À ce stade, le problème est résolu. Si le répertoire existe, une barre oblique sera ajoutée automatiquement. S'il n'existe pas, il correspondra et entrera index.php.
Je suis très confus, s'il vous plaît donnez-moi quelques conseils, pourquoi est-ce comme ça ?
De plus, en raison de certains problèmes originaux du projet, il y a beaucoup d'autres règles de réécriture ciblées dans la 3ème règle, donc je ne veux pas entrer dans la 3ème règle lorsque l'entrée est un dossier et qu'elle existe. les règles, même si l'impact sur les performances n'est pas significatif.
Après de nombreux tests, je l'ai compris moi-même.
Il n'y a rien de mal avec ces trois règles, et la seconde n'est pas bizarre comme je l'ai déjà dit.
Tout d'abord, nginx correspondra selon les règles définies par l'utilisateur. Lorsque le chemin que vous entrez existe et ne contient pas de barre oblique à la fin,
Puisque index.php existe dans mon dossier,
$request_filename/index.php
匹配第二条规则成功,注意这里的/
, puis effectuez une correspondance ultérieure. En d’autres termes, tant que ce dossier existe et qu’il y a index.html ou index.php dans ce dossier, il correspondra à la première ou à la deuxième règle que j’ai donnée ci-dessus, cela ne fait aucun doute.Donc, si vous souhaitez éviter la correspondance après la première ou la deuxième règle et ajouter automatiquement des barres obliques lorsque le dossier existe, la solution est d'ajouter un jugement sur le dossier avant la première règle :
La signification de cette règle est que si le dossier existe et qu'il n'y a pas de barre oblique, il ajoutera automatiquement une barre oblique et effectuera un saut 301 OK, le problème est résolu.
La logique de ce dernier est que si les conditions précédentes ne sont pas remplies, "si le chemin accédé n'est pas un fichier", il passera automatiquement à /index.php.
Suggestion : insérez une phrase -e avant le troisième élément pour vérifier s'il s'agit d'un dossier. Si c'est le cas, ajoutez automatiquement une barre oblique et un saut.
Non testé, pour référence seulement.