
Probablemente me estoy perdiendo algo obvio, pero no sé qué es. Y esto probablemente sea un duplicado; He leído cientos de preguntas sobre el sistema operativo aquí sobre reescrituras de nginx, pero no parecen coincidir con mi caso de uso.
El problema que estoy tratando de resolver es implementar una solución alternativa para CAS donde la aplicación cliente le dice a CAS que la URL de retorno es HTTP cuando en realidad es HTTPS. El lado del servidor estaba logrando desenredar esto hasta que Google decidió lanzar v87, lo que le molesta por las redirecciones https->http. Por lo tanto, estoy intentando cambiar la URL enviada a CAS. Quiero reemplazar "http" con "https" en la consulta, por ejemplo
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/
Aquí está mi configuración
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;
(No hay otros bloques de ubicación en este servidor).
Cuando digo que los demás no funcionan, me refiero a que la URL no se cambia.
Las expresiones regulares parecen analizar la URL correctamente cuando las pruebo en una implementación PCRE separada, pero no parecen activarse en mi configuración de nginx.
ACTUALIZADO Habilité el registro de reescritura y las reescrituras parecen ignorar la parte de la 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"
¿Puedo convencer a nginx para que reescriba la consulta también?
Respuesta1
Según la actualización, la reescritura de expresiones regulares no se aplica a la parte de consulta de la URL. Pude resolver mi problema con:
if ($args ~* "(.*)vice=http(:|%3A)(.*)") {
set $newqry "$1vice=https:$3" ;
rewrite ^(.*)$ $1?$newqry? break;
}
(El '?' final después de newqry suprime la adición de la consulta original a la URL).