Неправильное перенаправление относительного пути с помощью Nginx

Неправильное перенаправление относительного пути с помощью Nginx

Я хочу реализовать обратный прокси с 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/; 
}

завершающий слеш перешлет ваш запрос с указанием пути.

Связанный контент