为什么我不能通过nginx代理传递访问子域?

我想通过Nginx和RoR Web服务器(如UnicornThinWEBrick )在本地计算机上部署我的Ruby on Rails应用程序。

如下图所示,我想通过post子域访问我的web-app:

 upstream sub { server unix:/tmp/unicorn.subdomain.sock fail_timeout=0; # server 127.0.0.1:3000; } server { listen 80; server_name post.subdomain.me; access_log /var/www/subdomain/log/access.log; error_log /var/www/subdomain/log/error.log; root /var/www/subdomain; index index.html; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby; } location @ruby { proxy_pass http://sub; } } 

一切工作正常,当我键入post.subdomain.me我可以看到我的RoR应用程序。

问题:当我使用post.subdomain.me url我无法访问我的子域( request.subdomain返回空和request.host返回subdomain instaed subdomain.me )。 但是,当我使用post.subdomain.me:3000时, post.subdomain.me:3000都很完美(我失去了一半的头发来实现这一点)。 为什么和如何解决?

当你用端口访问应用程序时 – 你直接访问rails服务器,而不是用nginx代理,这对于调试来说很好,但是通常不适合生产。

主机头可能不会被客户端传递, $host默认为nginx主机

尝试

 location @ruby { proxy_set_header Host $host; proxy_pass http://sub; } 

和一个'硬编码'方式: proxy_set_header Host post.subdomain.me;

proxy_set_headerproxy_redirect指令配置proxy_pass指令,并且需要位于相同的位置块中或从封闭的server块继承。 你需要像这样格式化你的配置文件:

 location / { try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby; } location @ruby { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://sub; } 

编辑:假设nginx没有正确地将信息传递给RoR,如@Vasfed建议,请为proxy_set_header Host尝试其他值。 还有三个候选人,所有的意思都略有不同。

  proxy_set_header Host post.subdomain.me; proxy_set_header Host $server_name; proxy_set_header Host $host;