
Я, возможно, упускаю что-то очевидное - но я не знаю, что именно. И это, вероятно, дубликат; я прочитал сотни вопросов об ОС здесь, на 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).