2012-09-06 41 views
2

我在cpanel上有一个简单的独角兽+ nginx设置,部署在capistrano上。该nginx.conf服务器块看起来是这样的:Nginx和Unicorn上resource_url的意外行为

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

是什么导致了这种情况,这两种助手方法之间的区别是什么?

回答

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_for(我希望你可以很容易地将它扩展为*_url助手,但我不确定)。

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

+1

我也有这个问题。非常感谢! –

+1

感谢提示。我解决了这个问题,改变了'proxy_pass'的名字,这样rails就能找到正确的名字。 – fuzzyalej