我試圖完成這幾天,但我做不到。我有兩個網路應用程式,一個生產和一個測驗,比方說https://production.app和https://testing.app. 我需要在https://production.app/location該點下創建一個反向代理https://testing.app/location(目前我只需要來自 prod 中的測驗環境的一項功能)。我創建的配置確實代理了這個確切的位置,但是該功能還從目錄加載資源,/static導致請求https://production.app/static/xyz.js而不是https://testing.app/static/xyz.js,并且/static不能被代理。有沒有辦法只在這個代理流量中更改標題,以便它https://testing.app/static(當然還有任何其他位置)?
以下是我當前的配置(僅關于代理的指令):
server {
listen 443 ssl;
server_name production.app;
root /var/www/production.app;
location /location/ {
proxy_pass https://testing.app/location/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
祝你有美好的一天 :)
uj5u.com熱心網友回復:
你的問題標題寫得不好。它與“更改標頭”無關,而 nginx 位置雖然本質上與請求處理相關,但也不是正確的術語。它應該類似于“如何以與其他方式不同的方式提供代理頁面請求的資產”。
好的,我們開始吧。首先,你真的明白下面的配置到底是做什么的嗎?
location /location/ {
proxy_pass https://testing.app/location/;
}
/location/在上游名稱之后指定的 URI 前綴https://testing.app具有以下效果:
- 指令中指定的
/location/前綴location從已處理的 URI 中截斷。 - 處理后的 UIR在被傳遞到上游之前被
/location/附加在指令中指定的前綴。proxy_pass
也就是說,如果這些前綴相等,則以下配置將執行相同的操作,從而消除這些步驟(因此處理請求的效率稍高一些):
location /location/ {
proxy_pass https://testing.app;
}
理解這一點是我們將要使用的技巧的關鍵概念。
由于從頁面發出的所有靜態資產請求/location/的 HTTPReferer標頭都等于http://production.app/location/(好吧,除非您指定no-referer為 page referrer policy,如果您指定了,除非您更改它,否則整個技巧根本不起作用),我們可以重寫一個匹配某些條件的請求 URI(比如以/static/or/img/前綴開頭),使用以下塊將其重定向到某個特殊的內部位置if(應該放在server配置級別):
if ($http_referer = https://production.app/location/) {
rewrite ^/static/ /internal$uri;
rewrite ^/img/ /internal$uri;
...
}
我們可以使用任何前綴,/internal這里使用的只是作為示例,但是使用的前綴不應干擾您現有的路由。internal接下來,我們將使用關鍵字定義該特殊位置:
location /internal/ {
internal;
proxy_pass https://testing.app/;
}
http://testing.app此處上游名稱后面的斜杠是必不可少的部分。它將使代理的 URI 回傳到其原始狀態,洗掉之前/internal/由指令添加的前綴rewrite并用單個斜杠替換它。
您可以使用正則運算式模式在多個頁面上使用此技巧來匹配Referer標題值,例如
if ($http_referer ~ ^https?://production\.app/(page1|page2|page3)/) {
...
}
除了靜態資產之外,您不應該嘗試其他任何東西,否則它會破壞應用程式路由機制。這也只是一種只能用于測驗目的的解決方法,而不是我可以長期推薦用于生產用途的方法。
順便說一句,你確定你真的需要那個嗎
proxy_set_header Host $host;
在你的位置線?你真的明白它是什么意思,或者你只是從其他配置中復制粘貼使用它嗎?如果出現問題,請檢查此答案不要感到驚訝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/479807.html
