nginx 重写查询未触发

nginx 重写查询未触发

我可能忽略了一些显而易见的东西 - 但我不知道它是什么。这可能是重复的;我在这里阅读了数百个关于 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)。

相关内容