nginx 書き換えクエリが起動しない

nginx 書き換えクエリが起動しない

おそらく何か明らかなことを見逃しているのでしょうが、それが何なのかはわかりません。また、これはおそらく重複しているでしょう。nginx の書き換えに関する何百もの OS の質問を読みましたが、私のユースケースには一致していないようです。

私が解決しようとしている問題は、クライアント アプリケーションが CAS に、実際には HTTPS であるにもかかわらず、戻り URL が HTTP であると伝えるという CAS の回避策を実装することです。Google が https->http リダイレクトに問題のある v87 をリリースするまで、サーバー側はこれを解決しようとしていました。そのため、CAS に送信される URL を変更しようとしています。クエリ内の "http" を "https" に置き換えたいのです。例:

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/

これが私の設定です

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;

(このサーバーには他のロケーション ブロックはありません)。

他のものが機能しないと言うのは、URL が変更されていないことを意味します。

別の PCRE 実装でテストすると、正規表現は URL を正しく解析しているように見えますが、nginx 構成では実行されていないようです。

更新しました 書き換えログを有効にしましたが、書き換えではクエリ部分が無視されるようです。

 *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"

nginx にクエリを書き換えるように説得できますか?

答え1

アップデートにより、書き換え正規表現は URL のクエリ部分に適用されなくなりました。私は次の方法で問題を解決できました:

            if ($args ~* "(.*)vice=http(:|%3A)(.*)") {
                    set $newqry "$1vice=https:$3" ;
                    rewrite ^(.*)$ $1?$newqry? break;
            }

(newqry の後の末尾の「?」は、URL への元のクエリの追加を抑制します)。

関連情報