我可能遗漏了一些明显的东西——但我不知道它是什么。这可能是重复的;我已经阅读了关于 nginx 重写的数百个操作系统问题 - 但它们似乎与我的用例不匹配。
我要解决的问题是为 CAS 实施一种解决方法,其中客户端应用程序告诉 CAS 返回 URL 是 HTTP,而实际上它的 HTTPS。服务器端设法解决了这个问题,直到 Google 决定发布对 https->http 重定向感到不安的 v87。因此,我试图更改发送到 CAS 的 URL。我想在查询中用“https”替换“http”,例如
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 也重写查询吗?
根据更新,重写正则表达式不适用于 URL 的查询部分。我能够通过以下方式解决我的问题:
(newqry 之后的尾随 '?' 禁止将原始查询添加到 URL)。