Umgebung: Nginx-Version ist 1.2.6
Vor kurzem bin ich bei der Arbeit an einem Projekt auf ein seltsames Problem gestoßen. Da ich die URL neu gestalten wollte, habe ich die folgenden Nginx-Umschreibungsregeln verwendet:
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; }
Diese Umschreiberegel wird häufig verwendet. Ich weiß nicht, ob etwas falsch ist (bitte geben Sie mir einen Rat)
Wenn ich diese Regeln nicht verwendet habe, wurde beim Zugriff auf ein vorhandenes Verzeichnis auf dem Server automatisch ein Schrägstrich hinzugefügt. Dies ist normal und kein Problem.
Aber nachdem ich die oben genannten Regeln hinzugefügt habe, werden Schrägstriche nicht automatisch hinzugefügt, wenn auf Ordner zugegriffen wird, die bereits auf dem Server vorhanden sind. Außerdem habe ich nach wiederholten Tests festgestellt, dass die 2. und 3. Regel Probleme verursachten:
1. Wenn Sie nur die zweite Regel löschen, wird Ihr Ordner unabhängig davon, ob er existiert oder nicht, als nicht vorhanden erkannt und kein Schrägstrich hinzugefügt. Er wird direkt in die dritte Regel eingefügt und stimmt schließlich mit dem Index überein .php. Es ist ersichtlich, dass es zu diesem Zeitpunkt per Datei verarbeitet wird.
2. Wenn die zweite Regel gelöscht wird, bestimmt die dritte Regel die Datei -f
改为 -e
, also die Datei oder den Ordner:
if (!-e $request_filename){ rewrite (.*) /index.php; }
Zu diesem Zeitpunkt ist das Problem gelöst. Wenn das Verzeichnis nicht vorhanden ist, wird es mit index.php übereinstimmt.
Ich bin sehr verwirrt, bitte geben Sie mir einen Rat, warum ist das so?
Darüber hinaus gibt es aufgrund einiger ursprünglicher Probleme des Projekts viele andere gezielte Umschreiberegeln in der dritten Regel, daher möchte ich die dritte Regel nicht eingeben, wenn es sich bei der Eingabe um einen Ordner handelt und dieser vorhanden ist die Regeln, obwohl die Auswirkungen auf die Leistung nicht signifikant sind.
经过多次测试,自己搞明白了。
这三条规则并没有什么问题,第二条也并不是我之前所说的有什么诡异的地方。
首先,nginx会根据用户自定义的规则进行匹配,当你输入的路径存在且在最后不含有斜杠时,
由于我这个文件夹下存在index.php,所以
$request_filename/index.php
匹配第二条规则成功,注意这里的/
,然后进行之后的匹配。也就是说,只要这个文件夹是存在的,且这个文件夹下有 index.html 或者 index.php 就会匹配我上面给出的第一条或者第二条规则,这没有任何疑问。所以,你如果想要在文件夹存在时不会进行第一或者二条规则之后的匹配且会自动加斜杠,解决办法是在第一条规则之前加上一条对文件夹的判断:
这条规则的意思是,如果文件夹存在且没有斜杠时自动加斜杠并进行301跳转,OK,问题解决。
最后一条的逻辑是,在不满足前面条件的情况下,“如果访问的路径不是文件”就自动跳转到/index.php。
建议:在第三条之前插入一句 -e 检测是否是文件夹,如果是,自动加斜杠,break。
未测试,仅供参考。