So konfigurieren Sie Nginx so, dass '?…' Als Teil des Dateinamens behandelt wird

9

Nginx stellt nur statische Dateien bereit, einige Dateinamen enthalten jedoch '?'. Ja, das Fragezeichen.

Alle URLs, die '?' Ausbeute 404, obwohl die Datei tatsächlich existiert. z.B

> GET /foo?lang=ar.html HTTP/1.1
...
...
< HTTP/1.1 404 Not Found

Während eine Datei mit dem Namen foo? Lang = ar.html am erwarteten Speicherort vorhanden ist.

Ich frage mich, ob es eine Möglichkeit gibt, Nginx anzuweisen, die gesamte Anfrage als URL zu behandeln, einschließlich der aktuell als Abfragezeichenfolge übersetzten.

Die einzige Lösung, die ich im Sinn habe, besteht darin, einen kleinen Webserver zu schreiben, der dies tut, und einen Nginx-Reverse-Proxy für diesen Webserver zu haben, aber ich bevorzuge es, ihn nur mit Nginx zu erledigen.

Tzury Bar Yochay
quelle
2
Nun, ein Fragezeichen ist ein Sonderzeichen, das den Anfang der Abfragezeichenfolge kennzeichnet, sodass es niemals Teil des Dateinamens sein kann. Ich kann es derzeit nicht testen, versuche aber möglicherweise, es in der URL durch die maskierte Version zu ersetzen. %3f.
Shane Madden
@ShaneMadden Das wird funktionieren, aber wie können Sie zwischen einem Dateinamen und nur einem URI unterscheiden, der auf eine CGI verweist, die Parameter akzeptiert? Sieht so aus, als würde dies ein administrativer Albtraum werden. :) Edit: Es wird definitiv funktionieren. Habe es gerade auf meinem Webserver versucht und ich habe eine bekommen GET /header.php%3fbla HTTP/1.1" 404.
Alexander Janssen

Antworten:

12

Sie können try_files mit entweder $request_urioder $uri$is_args$argsabhängig davon verwenden, ob die urlencodierten Bits dekodiert werden sollen oder nicht, wenn Sie nach dem Dateinamen suchen.

Kolbyjack
quelle