在 nginx 中使用路徑時,我在使反向代理正常工作時遇到問題。我想做的是為應用程式提供一個地址,並用路徑來指定環境。根據路徑,它將指向不同的伺服器。使用直接連結時,我可以使反向代理正常工作,但使用路徑時會出現 404 錯誤。
app.foo.bar/dev = 404 錯誤 devapp.foo.bar = 成功
我在 app.foo.bar/dev 上做錯了什麼?
這是正在運行的反向代理設置,但我不想使用:
server {
listen 80; # DEV Application Proxy
server_name devapp.foo.bar;
location / {
proxy_pass http://appserver.foo.bar:7010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect http://appserver.foo.bar:7010/ /;
proxy_connect_timeout 300;
}
}
這是我想要透過使用路徑執行的操作的一部分,但出現 404 錯誤。
# APP Environment Proxy
server {
listen 80;
server_name app.foo.bar;
location /dev {
proxy_pass http://appserver.foo.bar:7010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect http://appserver.foo.bar:7010 /;
proxy_connect_timeout 300;
}
}
我已經用谷歌搜尋過這種類型的設置,但找不到解決方案。預先感謝您的任何幫助。
答案1
當您有 時proxy_pass http://appserver.foo.bar:7010;
,nginx 會將規範化的 URI 附加到傳遞到後端的請求 URL 中。
因此,當您請求時http://app.foo.bar/dev
,請求將轉到http://appserver.foo.bar:7010/dev
。如果你的開發伺服器沒有這個路徑,那麼它將回傳 404,nginx 回傳給客戶端。
如果您希望所有以 開頭的請求都http://app.foo.bar/dev
轉到,http://appserver.foo.bar:7010
以便將 URI 的所有其餘部分新增至後端伺服器 URI,那麼您可以使用以下設定:
location ~ ^/dev(.+)$ {
proxy_pass http://appserver.foo.bar:7010$1$is_args$args;
...
}
因此,我們使用正規表示式將後面的部分捕獲/dev
到變數中,然後將該變數新增到proxy_pass
路徑末尾。