Warum nginx „return 301“ und „try_files“ in eine Endlosschleife geraten

Warum nginx „return 301“ und „try_files“ in eine Endlosschleife geraten

mein Conf-Code:

index index.html index.php;
location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

Wenn die URL lautet , wird aus dem Teil, der am Ende hinzugefügt wird, /a/301 zu ./atry_files//a/a/

Als nächsten Schritt wird meiner Meinung nach die indexDefinition versucht, zu werden /a/index.htmlund die Datei zu erreichen.

Aber tatsächlich versucht es /a/, und springt aus dem heraus location, um dann wieder hineinzugehen location, um if ($uri = '/a/') { ... }.

Dann eine Endlosschleife.

Warum? Ich war einfach verwirrt.


Was ich tun möchte, ist

  1. Wenn angefordert example.com/a/, springen Sie zu example.com/a, dann zu 2
  2. Wenn angefordert example.com/a, anzeigen example.com/a/index.html(aber URL ist example.com/a).

Kann mir jemand helfen, das zu erreichen?

Antwort1

Es tut genau das, was es tun soll.

Sie können nie dorthin gelangen, /a/index.htmlweil Sie immer wieder zurück zu umleiten, /abevor dies überhaupt passieren kann. Wenn nginx dies verarbeitet, sieht es das Verzeichnis im Dateisystem und leitet automatisch (korrekt) zu um /a/.

Sie sollten diese unangemessene Weiterleitung entfernen.

Antwort2

Willkommen bei ServerFault. Sie können das im OP erwähnte mit dem folgenden Code tun ...

location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

Die entsprechende Frage und die akzeptierte Antwort finden Sie unterEntfernen des abschließenden Schrägstrichs aus einer URL mit nginx.

Grundsätzlich sind wir nicht darauf angewiesen und können direkt bei Bedarf indexaushelfen .index.htmlexample.com/a

verwandte Informationen