Запрос на переписывание nginx не срабатывает

Запрос на переписывание nginx не срабатывает

Я, возможно, упускаю что-то очевидное - но я не знаю, что именно. И это, вероятно, дубликат; я прочитал сотни вопросов об ОС здесь, на nginx rewrites - но они, похоже, не соответствуют моему варианту использования.

Проблема, которую я пытаюсь решить, заключается в реализации обходного пути для CAS, где клиентское приложение сообщает CAS, что URL возврата — HTTP, когда на самом деле это HTTPS. Серверная сторона справлялась с этим, пока Google не решила выпустить v87, которая расстраивается из-за перенаправлений https->http. Поэтому я пытаюсь изменить URL, отправляемый в CAS. Я хочу заменить «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-адрес не изменился.

Регулярные выражения, по-видимому, правильно анализируют URL, когда я тестирую их в отдельной реализации PCRE, но, похоже, не срабатывают в моей конфигурации 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

Согласно обновлению, rewrite regexs не применяются к части запроса URL. Я смог решить свою проблему с помощью:

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

(завершающий символ «?» после newqry подавляет добавление исходного запроса в URL).

Связанный контент