
Ich übersehe wahrscheinlich etwas Offensichtliches – aber ich weiß nicht, was es ist. Und das hier ist wahrscheinlich ein Duplikat; ich habe hier Hunderte von OS-Fragen zu Nginx-Rewrites durchgelesen – aber sie scheinen nicht zu meinem Anwendungsfall zu passen.
Das Problem, das ich zu lösen versuche, besteht darin, einen Workaround für CAS zu implementieren, bei dem die Client-Anwendung CAS mitteilt, dass die Rücksprung-URL HTTP ist, obwohl es eigentlich HTTPS ist. Die Serverseite hat es geschafft, dies zu entwirren, bis Google sich entschied, Version 87 zu veröffentlichen, die sich über https->http-Umleitungen aufregt. Ich versuche daher, die an CAS gesendete URL zu ändern. Ich möchte in der Abfrage „http“ durch „https“ ersetzen, z. B.
https://cas.example.com/cas/login?service=http:%2F%2Fapp.example.com/
should be re-written as
https://cas.example.com/cas/login?service=https:%2F%2Fapp.example.com/
Hier ist meine Konfiguration
location / {
## this one works....
# rewrite /foo/(.*) /$1 break;
## these don't....
# rewrite ^([^\?]+)\?service=http:(.*)$ $1?service=https:$2 break;
# rewrite ^([^\?]+)\?service=http%(.*)$ $1?service=https%$2 break;
rewrite /(.*)vice=http:(.*) /$1vice=https:$2 break;
rewrite /(.*)vice=http%(.*) /$1vice=https%$2 break;
rewrite /(.*)vice=http(.*) /colin.bip?f=$1vice=other$2 break;
rewrite /(.*)foo(.*) /$1bar$2 break;
(Es gibt keine anderen Standortblöcke auf diesem Server).
Wenn ich sage, dass die anderen nicht funktionieren, meine ich, dass die URL nicht geändert wird.
Die regulären Ausdrücke scheinen die URL korrekt zu analysieren, wenn ich sie in einer separaten PCRE-Implementierung teste, aber sie scheinen in meiner Nginx-Konfiguration nicht ausgelöst zu werden.
AKTUALISIERT Ich habe die Protokollierung der Neuschreibungen aktiviert – und die Neuschreibungen scheinen den Abfrageteil zu ignorieren?
*1 "/(.*)foo(.*)" does not match "/url.php", client: 10.1.1.7, server: example.com, request: "GET /url.php?q=foo&service=http://hello HTTP/1.1"
Kann ich Nginx davon überzeugen, die Abfrage auch neu zu schreiben?
Antwort1
Gemäß dem Update werden Rewrite-Regexes nicht auf den Abfrageteil der URL angewendet. Ich konnte mein Problem folgendermaßen lösen:
if ($args ~* "(.*)vice=http(:|%3A)(.*)") {
set $newqry "$1vice=https:$3" ;
rewrite ^(.*)$ $1?$newqry? break;
}
(das abschließende „?“ nach newqry unterdrückt das Hinzufügen der ursprünglichen Abfrage zur URL).