Неследующий/предваряющий ‘/’ удаляется в proxy_pass

Вопрос или проблема

Я использую 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 останется неизменным).

Дополнительные настройки

  1. Проверка пути: После всех изменений, убедитесь, что ваш путь корректно пробрасывается. Вы можете сделать это, добавив директиву error_log, чтобы записывать больше информации о запросах.

  2. Логи: Убедитесь, что вы проверяете логи вашего NGINX и контейнера с prerender.io для лучшего понимания, каким образом обрабатываются ваши запросы.

  3. Тестирование: После внесенных изменений протестируйте еще раз, обращаясь к вашему маршруту через NGINX. Если всё сделано правильно, вывод пререндерера должен корректно обрабатывать ваш URL.

Заключение

Проблема с удалением слэша в URL при использовании NGINX в качестве обратного прокси может быть решена грамотной настройкой директивы proxy_pass. Путём удаления завершающего слэша вы предотвратите модификацию URL и обеспечите корректную работу вашего приложения. В случае дальнейших проблем не стесняйтесь проверять различные конфигурации и ведение логов для нахождения оптимального решения.

Если у вас появятся дополнительные вопросы или требуется более детальное объяснение, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...