在Nginx和Unicorn上使用resource_url的意外行为

时间:2012-09-06 16:52:29

标签: ruby-on-rails ruby-on-rails-3 nginx unicorn

我在cpanel上有一个简单的独角兽+ nginx设置,与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之类的资源的任何引用都会产生与网址助手相关的奇怪行为。

<%= users_path %>按预期变为my.dev.site.com/users

<%= users_url %>变为unicorn_dev_site/users

导致这种情况的原因是什么,以及这两种帮助方法之间的区别是什么?

1 个答案:

答案 0 :(得分:3)

这是你的代理。 *_path助手生成

形式的字符串
/path

*_url助手生成类似

的字符串
http(s)://h.o.s.t/path

感谢您的代理设置,当请求到达Rails时,它已被调整,以便主机列为http://unicorn_dev_site,Rails忠实地复制它生成的URL。

也就是说,除非你有多个主机,否则通常不需要使用*_url助手而不是*_path助手。但是,如果您想使用它们,则有几个选项:您可以在控制器中set the default host,也可以使用:host选项基于每个URL进行设置{{3 (我希望你可以很容易地将它扩展到*_url助手,但我肯定不知道。)

无论如何 - 希望有所帮助!