![Nginx-Map-Direktive entspricht nicht den Regeln](https://rvso.com/image/697395/Nginx-Map-Direktive%20entspricht%20nicht%20den%20Regeln.png)
Ich habe diese Nginx-Konfigurationsdatei:
map $request_uri $new_uri {
default DEFAULT;
/shell http://shell.com;
/lol http://lol.com;
}
map $request_uri $ret_code {
default 301;
/shell 301;
/lol 302;
}
server {
listen 80;
server_name TestDomain.com www.TestDomain.com;
location / {
add_header X-request_uri $request_uri;
add_header X-new_uri $new_uri;
add_header X-return_code $ret_code;
if ($new_uri = "DEFAULT") {
return 301 https://ashfame.com$request_uri;
}
if ($ret_code = 301) {
return 301 $new_uri;
}
if ($ret_code = 302) {
return 302 $new_uri;
}
}
}
Die Map-Direktive funktioniert überhaupt nicht, sondern greift standardmäßig auf das zurück, was als Standard definiert ist.
Zum Beispiel:
$ curl -I testdomain.com/lol
HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.0 (Ubuntu)
Date: Sun, 22 Jan 2017 20:04:06 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://ashfame.com/lol
X-request_uri: /lol
X-new_uri: DEFAULT
X-return_code: 301
/lol
$new_uri
hätte als http://lol.com
und $ret_code
als festgelegt werden sollen 302
, aber wenn Sie sich die Kopfzeilen ansehen X-
, werden einfach die in der Zuordnung angegebenen Standardwerte übernommen.
Vor einer Woche habe ich dieselbe Nginx-Konfiguration zum Laufen gebracht und seitdem hat sich nichts geändert. Ich habe zwar Ubuntus automatische Sicherheitsupgrades aktiviert, aber ich glaube nicht, dass Nginx überhaupt aktualisiert wurde. Läuft v1.10.0
. Ich kann nicht wirklich sagen, warum das nicht mehr funktioniert.
Bearbeiten: Habe diese Konfiguration gerade auf einem anderen VPS getestet, mit derselben Nginx-Version, und dort funktioniert sie einwandfrei. Wie kann ich das jetzt überhaupt beheben?
Antwort1
Ich habe das Problem herausgefunden. Ich hatte mehrere solcher Konfigurationsdateien für jede Domäne und da die Karte im HTTP-Kontext definiert ist, überschrieb die letzte den Wert der Variablen. Ich habe es behoben, indem ich den Variablennamen in jeder Konfigurationsdatei mit einem Suffix versehen habe, sodass die Variablen eindeutig sind:
map $request_uri $new_uri_5 {
default DEFAULT;
/shell http://shell.com;
/lol http://lol.com;
}
map $request_uri $ret_code_5 {
default 301;
/shell 301;
/lol 302;
}
server {
listen 80;
server_name TestDomain.com www.TestDomain.com testdomain.com www.testdomain.com;
location / {
add_header X-request_uri $request_uri;
add_header X-new_uri $new_uri_5;
add_header X-return_code $ret_code_5;
if ($new_uri_5 = "DEFAULT") {
return 301 https://ashfame.com$request_uri;
}
if ($ret_code_5 = 301) {
return 301 $new_uri_5;
}
if ($ret_code_5 = 302) {
return 302 $new_uri_5;
}
}
}
5 ist die ID dieser bestimmten Domäne in meinem System.
Antwort2
Ich habe unter Nginx 1.12.2 dasselbe Problem festgestellt – die Map-Direktive stimmte mit keinem der Muster überein, nicht einmal mit den einfachsten und trivialsten wie /
, und verwendete immer den Standardwert.
Das Problem wurde durch die Verwendung der Variable in der Zuordnung verursacht $uri
. Einige Nginx-Konfigurationen haben den $uri
ursprünglichen Wert implizit geändert, indem sie /index.php
ein Präfix vorangestellt haben, was zu einer Musterfehlanpassung führte. Ein solches Verhalten $uri
ist beabsichtigt und die genaue Unterscheidung zwischen$request_uri
und $uri
Variablen.
Die Lösung bestand darin, die URI-Variable in der Nginx-Konfiguration zu ersetzen:
map $uri $result_var {
# ...
}
mit den folgenden:
map $request_uri $result_var {
# ...
}