nginx 重寫查詢未觸發

nginx 重寫查詢未觸發

我可能錯過了一些明顯的東西 - 但我不知道它是什麼。這可能是重複的;我已經閱讀了數百個關於 nginx 重寫的作業系統問題 - 但它們似乎與我的用例不符。

我試圖解決的問題是為 CAS 實作一個解決方法,其中客戶端應用程式告訴 CAS 返回 URL 是 HTTP,而實際上是 HTTPS。伺服器端一直在設法解決這個問題,直到 Google 決定發布 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)。

相關內容