
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/;
}
末尾のスラッシュはパスとともにリクエストを転送します。