Nginx での相対パスのリダイレクトが正しくない

Nginx での相対パスのリダイレクトが正しくない

Web アプリケーションにアクセスするために、Nginx でリバース プロキシを実装したいと考えています。リダイレクトで問題が発生しました。たとえば、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/ログインしかし、その代わりに、https://myip/ログインルーティングされません。proxy_redirect、proxy_headers などのさまざまなパラメータを試しましたが、成功しませんでした。

答え1

Pythonアプリケーションは にリダイレクトしている/loginので、ブラウザは をリクエストします。

https://myip/login

これにより、/app位置情報ブロックが回避されます。

要件が何であるか分からないため、正確な回答はできませんが、次の方法で問題ありません。

リダイレクト先を変更する/app/login

あなたの場合、転送されたリクエストに URI を追加することを Nginx に伝える必要があります。

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

末尾のスラッシュはパスとともにリクエストを転送します。

関連情報