
Я хочу реализовать обратный прокси с Nginx для доступа к веб-приложению. Я столкнулся с трудностями при перенаправлении. Например, предположим, что у меня есть http-сервер Python (на практике я не могу изменить настройки/код сервера):
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/логин, который не маршрутизируется. Я пробовал разные параметры, такие как 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, чтобы устранить эти и другие потенциальные аномалии. Затем вы можете создать определенные исключения в конфигурации Nginx, если есть определенные запросы (например, CDN), которые не должны отправляться в приложение python.
решение2
это должно сработать
> location /app {
> proxy_pass http://127.0.0.1:8080/;
}
завершающий слеш перешлет ваш запрос с указанием пути.