Теги: nginx, apache, подземный стук
Как сломать редиректы в связке nginx — apache+passenger
Один мой коллега (как это любит говорить один мой бывший коллега) сейчас обратился за помощью.
Стоит у него сервачок, на сервачке стоит нгинкс, за нгинксом стоит апач с пассажиром, за ними крутится с пяток рельсовых приклад.
Повесил он на сервачок шестую прикладу, а в ней почему-то redirect_to не работает:
redirect_to root_path
приводит к перенаправлению на http://app.example.com/.example.com
Оказывается, такого результата легко добиться, когда имя домена третьего уровня совпадает с названием upstream-а в nginx.conf:
upstream app {
server 127.0.0.1:8010;
}
server {
listen 80;
server_name app.example.com;
location / {
access_log /var/log/www/some;
proxy_pass http://app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600;
}
}
Простенький пример конфига нгинкса, правда? Тем не менее, когда в нгинкс приходит редирект:
HTTP/1.1 302 Found Location: http://app.example.com/
нгинкс видит, что начальная часть location совпадает с названием upstream-a, и вырезает её к псам свинячьим:
HTTP/1.1 302 Found Location: .example.com/
После чего браузер и идёт в http://app.example.com/.example.com/
Чтобы этого не было, достаточно изменить nginx.conf так, чтобы название апстрима не совпадало с поддоменом, например:
upstream my-app-upstream {
server 127.0.0.1:8010;
}
server {
listen 80;
server_name app.example.com;
location / {
access_log /var/log/www/app;
proxy_pass http://my-app-upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600;
}
}