Nginx 的相對路徑重新導向不正確

Nginx 的相對路徑重新導向不正確

我想使用 Nginx 實作反向代理來存取 Web 應用程式。我在重定向方面遇到了困難。例如,假設我有一個 Python http 伺服器(實際上,我無法修改伺服器設定/程式碼):

import http.server
import socketserver

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/login':
            self.path = 'login.html'
        elif self.path == '/':
            self.send_response(301)
            self.send_header('Location', '/login')
            self.end_headers()
        return http.server.SimpleHTTPRequestHandler.do_GET(self)

handler_object = MyHttpRequestHandler
serv = socketserver.TCPServer(("127.0.0.1", 8080), handler_object)

我對 Nginx 有以下設定:

location /app {
        proxy_pass http://127.0.0.1:8080;
}

當我去https://myip/應用程式/,我應該被重定向到https://myip/app/登入。但我沒有這樣做,而是被重定向到https://myip/登入,未路由。我嘗試了不同的參數,如 proxy_redirect、proxy_headers...但沒有成功。

答案1

您的 python 應用程式正在重定向到/login,因此瀏覽器將請求

https://myip/login

然後繞過你的/app位置區塊。

我無法真正給你答案,因為我不知道你的要求是什麼,但以下內容可行:

將您的重定向更改為/app/login

在您的情況下,您需要告訴 Nginx 您想要在轉送的請求中附加 URI:

在 Nginx 設定中,將 $request_url 新增到轉送的請求中:

location /app {
    proxy_pass http://127.0.0.1:8080$request_uri;
}

對我來說,這是一個有點脆弱的解決方案,假設你需要有/app你的位置。

理想情況下,您應該將根 URI 反向代理location /到 python 應用程序,以消除這些和其他潛在的異常情況。如果存在某些不應傳送至 python 應用程式的請求(例如 CDN),您可以在 Nginx 設定中建立特定的異常。

答案2

這應該有效

    > location /app {
    >         proxy_pass http://127.0.0.1:8080/; 
}

尾部斜線將透過路徑轉發您的請求。

相關內容