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/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/; 
}

尾随斜杠将转发您的请求以及路径。

相关内容