Параметр proxy_headers
Параметр proxy_headers применяется к команде запуска
uvicorn и включает доверие заголовкам,
которые добавляет обратный прокси (nginx, Traefik, HAProxy).
По умолчанию Uvicorn доверяет таким заголовкам,
поэтому значение параметра равно True.
Если приложение доступно напрямую из интернета,
параметр лучше отключить, чтобы клиент не мог подделать
свой IP-адрес и схему запроса.
Когда параметр включён, Uvicorn читает заголовки
X-Forwarded-For и X-Forwarded-Proto
и подставляет их значения в объект запроса.
Тогда request.client.host и request.url.scheme
отражают реального клиента, а не прокси.
Синтаксис
uvicorn app:app --proxy-headers
uvicorn app:app --no-proxy-headers
Флаг --proxy-headers включает доверие заголовкам,
флаг --no-proxy-headers отключает его.
Пример
Давайте создадим приложение, которое возвращает IP-адрес клиента и схему запроса:
from fastapi import FastAPI, Request
app = FastAPI()
@app.get('/')
def index(request: Request):
return {
'client': request.client.host,
'scheme': request.url.scheme,
}
Запустим сервер с включённым доверием заголовкам прокси:
uvicorn main:app --proxy-headers
Отправим запрос с заголовком X-Forwarded-For:
curl -H 'X-Forwarded-For: 203.0.113.5' http://127.0.0.1:8000/
Результат выполнения кода:
{"client": "203.0.113.5", "scheme": "http"}
Пример
Теперь отключим доверие заголовкам и повторим запрос:
uvicorn main:app --no-proxy-headers
Отправим тот же запрос с заголовком X-Forwarded-For:
curl -H 'X-Forwarded-For: 203.0.113.5' http://127.0.0.1:8000/
Результат выполнения кода:
Как видно, при отключённом параметре заголовок игнорируется, и возвращается реальный адрес клиента.