Я использую два контейнера Docker для размещения своего приложения. Первый контейнер содержит порт прослушивания nginx 80. Это «точка входа» для моего приложения, и в настоящее время он передает только все запросы в контейнер 2 (my-app). Конфигурация Nginx заключается в следующем:nginx 301 содержит внутренний адрес
user www-data;
worker_processes 4;
events {
worker_connections 1024;
}
http {
include mime.types;
server {
location/{
proxy_pass http://my-app:80;
}
}
}
конфигурации Nginx второго контейнера выглядит следующим образом:
user www-data;
worker_processes 4;
events {
worker_connections 1024;
}
http {
include mime.types;
server {
root /var/www/my-app/public;
location =/{
proxy_pass http://localhost:81;
}
location/{
try_files $uri $uri/ /index.html @backend;
}
location @backend {
proxy_pass http://localhost:81;
}
}
}
проблема: когда Nginx хочет, чтобы автоматически перенаправить клиента новый адрес, он корректно возвращает 301, но заголовок местоположения неправильно содержит внутренний адрес.
Например: если Я хожу в http://localhost:80/my-folder, запрос сначала идет в контейнер 1, который передает его в контейнер 2, который затем возвращает 301 с просьбой браузера для перехода к новому положению, которое неправильно следующему: http://my-app/my-folder/
правильное расположение должно содержать первоначально спросил хозяина: http://localhost/my-folder/
И, конечно, в производстве, адрес example.com/my-folder следует направить example.com/my-folder/, вместо того, чтобы мой -app/my-folder/
Почему nginx перенаправляет клиента с помощью внутреннего адреса? Как я могу решить эту проблему?
Вы можете разместить 'server_name .example.com;' внутри раздела 'server' вашего конфига. Вы также можете попробовать поставить 'proxy_set_header Host $ host;' (попробуйте также 'Host my-app;') в разделе 'location @backend;'. И убедитесь, что ваш сервер также отправляет 301 переадресацию. –