@13:50 January 18, 2010
Теги: 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;
        }
    }

Новый комментарий