我想使用 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/app/,我应该被重定向到https://myip/app/login。但我被重定向到https://myip/login,但未路由。我尝试了不同的参数,如 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 应用程序以消除这些和其他潜在异常。然后,如果某些请求(例如 CDN)不应发送到 Python 应用程序,您可以在 Nginx 配置中创建特定例外。
答案2
这应该可行
> location /app {
> proxy_pass http://127.0.0.1:8080/;
}
尾随斜杠将转发您的请求以及路径。