Неожиданное поведение с resource_url на Nginx и Unicorn

У меня есть простая установка unicorn+nginx на cpanel, развернутая с помощью capistrano. Блок сервера nginx.conf выглядит так:

server {
  error_log /var/log/nginx/vhost-error_log warn;
  listen 123.456.789.0;
  server_name my.dev.site.com www.my.dev.site.com;
  access_log /usr/local/apache/domlogs/my.dev.site.com-bytes_log bytes_log;
  access_log /usr/local/apache/domlogs/my.dev.site.com combined;
  root /home/me/sites/dev/current/public;
  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_pass http://unicorn_dev_site;
  }
  error_page 500 502 503 504 /500.html;
}

При такой настройке любая ссылка на такой ресурс, как User, приводит к странному поведению с помощниками URL.

<%= users_path %> становится my.dev.site.com/users, как и ожидалось.

<%= users_url %> становится unicorn_dev_site/users.

Что вызывает это и каковы различия между этими двумя вспомогательными методами, которые вызывают такое поведение?


person Chris Keele    schedule 06.09.2012    source источник


Ответы (1)


Это ваше проксирование. Помощники *_path генерируют строки вида

/path

в то время как помощники *_url генерируют строки вроде

http(s)://h.o.s.t/path

Таким образом, благодаря вашей настройке прокси, к тому времени, когда запрос попадает в Rails, он был настроен так, что хост указан как http://unicorn_dev_site, который Rails точно воспроизводит в URL-адресах, которые он генерирует.

Тем не менее, обычно нет необходимости использовать *_url хелперов вместо *_path хелперов, если у вас нет нескольких хостов. Однако, если вы хотите их использовать, у вас есть несколько вариантов: вы можете установите хост по умолчанию в ваших контроллерах, и вы также можете установить его для каждого URL-адреса с параметром :host url_for (я полагаю, что вы можете довольно легко распространить это на *_url помощников, но я не знаю, что для уверенности).

В любом случае - надеюсь, что это поможет!

person Xavier Holt    schedule 06.09.2012
comment
У меня тоже была эта проблема. Большое спасибо! - person Christian Bankester; 07.09.2012
comment
Спасибо за подсказки. Я решил эту проблему, изменив имя proxy_pass, чтобы рельсы получили правильное имя. - person fuzzyalej; 24.01.2013