Consulta de reescrita nginx não dispara

Consulta de reescrita nginx não dispara

Provavelmente estou perdendo algo óbvio - mas não sei o que é. E esta é provavelmente uma duplicata; Eu li centenas de perguntas aqui sobre reescritas do nginx - mas elas não parecem corresponder ao meu caso de uso.

O problema que estou tentando resolver é implementar uma solução alternativa para CAS, onde o aplicativo cliente informa ao CAS que o URL de retorno é HTTP, quando na verdade é HTTPS. O lado do servidor estava conseguindo desvendar isso até que o Google decidiu lançar a v87, que fica chateada com os redirecionamentos https-> http. Portanto, estou tentando alterar o URL enviado ao CAS. Quero substituir "http" por "https" na consulta, por exemplo

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/

Aqui está minha configuração

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;

(não há outros blocos de localização neste servidor).

Quando digo que os outros não funcionam, quero dizer que a URL não é alterada.

As expressões regulares parecem analisar o URL corretamente quando eu as testo em uma implementação PCRE separada, mas não parecem estar disparando na minha configuração do nginx.

ATUALIZADA Ativei o registro de reescrita - e as reescritas parecem ignorar a parte da consulta?

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

Posso convencer o nginx a reescrever a consulta também?

Responder1

De acordo com a atualização, as expressões regulares de reescrita não são aplicadas à parte de consulta do URL. Consegui resolver meu problema com:

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

(o '?' final após newqry suprime a adição da consulta original ao URL).

informação relacionada