
我想使用 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/;
}
尾部斜線將透過路徑轉發您的請求。