Вопрос или проблема
Я использую NGINX в качестве обратного прокси для отправки запросов на localhost:3001. localhost:3001 содержит контейнер Docker, в котором работает форк локальной версии prerender.io. Таким образом, полный запрос будет выглядеть как server/prerender/https://google.com, и возвращается статическая, отрендеренная версия google.com.
Проблема в том, что когда я проксирую запрос на localhost:3001, предрендерер регистрирует, что не смог предрендерить ‘https:/google.com’ (слеш в https:// был удален). Я тестировал localhost:3001 напрямую, не проходя через NGINX, и он предрендерился нормально. Я пытался подойти к этому вопросу с помощью правил переписывания и удаления конечного слеша в proxy_pass, но конечный результат остается тем же, где он регистрирует, что не может предрендерить ‘https:/google.com’.
Настройка:
location /prerender/ {
proxy_pass http://localhost:3001/;
proxy_set_header Host $host;
}
Есть идеи, как исправить эту проблему?
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, как NGINX обрабатывает пути и добавляет их в запросе при использовании директивы proxy_pass
. Давайте разберем каждую часть вашей конфигурации и предложим решение, а также объясним, почему возникает данная ситуация.
Описание проблемы
Ваш текущий конфиг выглядит следующим образом:
location /prerender/ {
proxy_pass http://localhost:3001/;
proxy_set_header Host $host;
}
Когда вы отправляете запросы на /prerender/https://google.com
, NGINX автоматически модифицирует путь при передаче запроса на указанный бэкенд (localhost:3001). В процессе происходит удаление одного из слэшей в URL (https:/google.com
вместо https://google.com
). Это происходит из-за того, что NGINX по умолчанию обрабатывает срез URL и приводит его к формату, который он интерпретирует.
Решение
Чтобы избежать нежелательного изменения структуры URL при использовании proxy_pass
, вам нужно удалить завершающий слэш в директиве proxy_pass
. Ваш конфиг должен выглядеть так:
location /prerender/ {
proxy_pass http://localhost:3001; # Удален завершающий слэш
proxy_set_header Host $host;
}
Объяснение
Когда вы используете завершающий слэш в proxy_pass
, NGINX воспринимает это как команду обрезать части URL при передаче на бэкенд. Удалив завершающий слэш, вы заставляете NGINX передать полный путь, который будет являться частью переданного запроса (то есть https://google.com
останется неизменным).
Дополнительные настройки
-
Проверка пути: После всех изменений, убедитесь, что ваш путь корректно пробрасывается. Вы можете сделать это, добавив директиву
error_log
, чтобы записывать больше информации о запросах. -
Логи: Убедитесь, что вы проверяете логи вашего NGINX и контейнера с prerender.io для лучшего понимания, каким образом обрабатываются ваши запросы.
-
Тестирование: После внесенных изменений протестируйте еще раз, обращаясь к вашему маршруту через NGINX. Если всё сделано правильно, вывод пререндерера должен корректно обрабатывать ваш URL.
Заключение
Проблема с удалением слэша в URL при использовании NGINX в качестве обратного прокси может быть решена грамотной настройкой директивы proxy_pass
. Путём удаления завершающего слэша вы предотвратите модификацию URL и обеспечите корректную работу вашего приложения. В случае дальнейших проблем не стесняйтесь проверять различные конфигурации и ведение логов для нахождения оптимального решения.
Если у вас появятся дополнительные вопросы или требуется более детальное объяснение, не стесняйтесь обращаться.