Richten Sie einen Catch-All innerhalb eines Standorts mit Fallback auf index.php ein

3267
Rudie

Ich habe mit nginx config zu kämpfen. Ich habe einen serverBlock, in den alle Anfragen gehen sollen index.php?tags=$uri, es sei denn, es $uriexistiert (wie index.php?a=boder /?a=b).

Ich würde erwarten:

try_files $uri index.php?tags=$uri; 

aber nein, das wäre zu einfach. Das funktioniert nicht /?a=b, was anscheinend nicht gefunden wird, also leitet es zuindex.php?tags=/

Vielleicht, wenn ich explizit ein beifüge index, was angemessen ist:

index index.php; 

Nee. Kein Würfel. Gleiches exaktes Ergebnis auf der ganzen Linie.

Auch nichts mit $args, $request_urioder Kombinationen. Auch nicht es:

try_files $request_uri/index.php $request_uri index.php?tags=$request_uri; // now I'm just guessing 

Apache wusste irgendwie, was ich immer meinte. Warum nicht Nginx? Ich hätte gerne diese Weiterleitungen (ohne redirectoder if):

/ => /index.php /index.php => /index.php /index.php?a=b => /index.php?a=b /?a=b => /index.php?a=b /foo => /index.php?tags=foo (or /index.php?tags=/foo) /foo/bar => /index.php?tags=foo/bar (or /index.php?tags=/foo/bar) /foo?bar=yes => /index.php?tags=/foo%3Fbar%3Dyes 

Ich möchte, dass die Abfragezeichenfolge bei der Umleitung codiert wird, nicht jedoch der Pfad, aber das ist nicht so wichtig.

(Ich verstehe auch nicht den praktischen Unterschied zwischen $ uri und $ request_uri. Sie scheinen die Hälfte der Zeit zu tun. Aber das ist für einen anderen Tag.)

Vielen Dank.

2

1 Antwort auf die Frage

2
Bernard Rosset

Ich erreiche das gewünschte Ergebnis mit dem folgenden Konfigurations-Snippet:

location = / { index index.php; }  location / { try_files $uri /index.php?tags=$request_uri; } 

try_filesversucht ... Dateien. Wenn Sie damit suchen /, suchen Sie nach einer Datei mit demselben Namen. Sie wird nicht als "Find the index file" interpretiert. indexmacht diesen Job Daher müssen Sie diesen Sonderfall von der Standardposition für den Rückfall trennen.

Das Beste ist der letzte Wunsch: Die Argumente werden nicht einmal verschlüsselt, da dies nicht erforderlich ist (nur das erste Fragezeichen eines URIs ist relevant, da alles, was folgt, sowieso ein Argument ist).

Beachten Sie die Verwendung von $request_uri(die den angeforderten URI enthält, mit Argumenten, aber nicht normalisiert / $uribereinigt ) anstelle des normalisierten (der den URI bereinigt und Argumente entfernt). So können Sie am Ende mit:

///foo?bar=yes => index.php?tags=///foo?bar=yes 

Wenn es Ihnen etwas ausmacht, können Sie es $urikombinieren mit $args:

location = / { index index.php; }  location / { try_files $uri /index.php?tags=$uri?$args; } 

produzieren:

///foo?bar=yes => index.php?tags=/foo?bar=yes 
Der `location = /` hat den Trick gemacht. Warum können Sie das nicht innerhalb des `location /` Blocks kombinieren? Bedeutet das "=", dass es nur mit dem exakten URI übereinstimmt? Vielen Dank. Sie sagen, Nginx sei einfach. Rudie vor 9 Jahren 0
Alles wird in der Dokumentation [`location`] (http://nginx.org/de/docs/http/ngx_http_core_module.html#location), die ich Ihnen vorschlage, ausführlich erklärt. Schauen Sie sich die verschiedenen Modifikatoren an. Bernard Rosset vor 9 Jahren 0