Вопрос или проблема
Привет, я использую Laravel на сервере NGINX и хотел бы использовать возможность обратного прокси NGINX в качестве API шлюза для моего Laravel и других приложений API на Node. Вот мои конфигурации:
URL приложения: staging-app.example.com
Конечная точка API приложения: staging-app.example.com/api
URL API шлюза: api.example.com
Что я хочу сделать, так это перенаправить все API-запросы api.example.com/staging-app
на staging-app.example.com/api
. Я добился перенаправления API-запроса, но, как-то, Authorization header
не передается прокси, что приводит к ошибке 401 неавторизован. Тогда как другие заголовки передаются.
Вот моя текущая конфигурация для api.example.com
в nginx:
server {
server_name api.example.com;
location /staging-app {
rewrite ^/staging-app/(.*)$ /$1 break;
proxy_pass http://staging-app.example.com/;
}
location /test {
rewrite ^/test/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:3333/;
}
listen [::]:443 ssl; # управляется Certbot
listen 443 ssl; # управляется Certbot
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # управляется Certbot
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # управляется Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # управляется Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # управляется Certbot
}
server {
if ($host = api.example.com) {
return 301 https://$host$request_uri;
} # управляется Certbot
listen 80;
listen [::]:80;
server_name api.example.com;
return 404; # управляется Certbot
}
А для моего приложения Laravel я использую конфигурацию, предоставленную самим Laravel
Обновление 1: Я пытался добавить proxy_set_header Test testingvalue
в блок location напрямую, но это тоже не сработало.
Попробуйте добавить следующее в вашу конфигурацию для сервера, слушающего на порту 443:
proxy_http_version 1.1;
proxy_set_header "Connection" "";
Это сделает соединение между мастер-сервером и агентами постоянным, что необходимо для аутентификации в некоторых конфигурациях.
Вы пробовали этот ответ?
Добавьте в блок location эти записи:
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
Ответ или решение
Отсутствие заголовка Authorization при проксировании NGINX к поддомену
Когда вы настраиваете NGINX как обратный прокси для вашего приложения на Laravel, важно правильно передавать заголовки, особенно заголовок авторизации (Authorization). Ваша конфигурация уже делает некоторые шаги в этом направлении, однако есть проблема с отсутствием заголовка Authorization в запросах, что приводит к ответу 401 Unauthorized.
Проблема
Вы настроили проксирование с api.example.com
на staging-app.example.com/api
, но заголовок Authorization не пересылается, что может быть вызвано следующими причинами:
- Конфигурация NGINX: По умолчанию, NGINX не передает заголовок Authorization. Его необходимо указать явно.
- Проблемы с соединением: Отсутствие постоянного соединения может также стать причиной, особенно если ваше приложение требует сохранения состояния.
Решение
Для того чтобы устранить проблему с отсутствием заголовка Authorization, внесите следующие изменения в конфигурацию вашего NGINX:
- Передача заголовка Authorization: Добавьте явную директиву
proxy_set_header
для передачи заголовка Authorization из исходного запроса. Это можно сделать следующим образом:
server {
server_name api.example.com;
location /staging-app {
rewrite ^/staging-app/(.*)$ /$1 break;
proxy_pass http://staging-app.example.com/;
# Добавление передачи заголовка Authorization
proxy_set_header Authorization $http_authorization;
# Опционально, передача заголовка по умолчанию
proxy_pass_header Authorization;
# Убедитесь, что используете правильную версию HTTP
proxy_http_version 1.1;
proxy_set_header Connection "";
}
location /test {
rewrite ^/test/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:3333/;
}
# SSL конфигурация
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = api.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name api.example.com;
return 404; # managed by Certbot
}
-
Постоянное соединение: Убедитесь, что
proxy_http_version
установлен в «1.1» и добавленproxy_set_header Connection ""
для поддержки постоянного соединения. Это важно, если ваше приложение использует методы аутентификации, которые зависят от состояния соединения. -
Тестирование конфигурации: После внесения изменений обязательно протестируйте конфигурацию NGINX с помощью команды:
sudo nginx -t
Если все тесты пройдены, перезапустите NGINX:
sudo systemctl restart nginx
Заключение
Таким образом, для успешной передачи заголовка Authorization при проксировании запросов через NGINX необходимо внести изменения в конфигурацию, включая обновление заголовков и использование постоянного соединения. После применения этих рекомендаций ваше приложение на Laravel должно успешно обрабатывать все запросы к API с корректно переданными заголовками авторизации. Если проблемы сохраняются, убедитесь, что на стороне вашего приложения нет дополнительных ограничений или проверок, блокирующих доступ.