我可能忽略了一些显而易见的东西 - 但我不知道它是什么。这可能是重复的;我在这里阅读了数百个关于 nginx 重写的操作系统问题 - 但它们似乎与我的用例不符。
我试图解决的问题是实现 CAS 的变通方法,即客户端应用程序告诉 CAS 返回的 URL 是 HTTP,但实际上是 HTTPS。服务器端一直在设法解决这一问题,直到 Google 决定发布 v87,而 v87 对 https->http 重定向感到不满。因此,我试图更改发送给 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)。