使rails url_helpers在生产中使用https

时间:2015-04-10 01:42:59

标签: ruby-on-rails nginx

我使用Rails url_helpers 在我的应用中构建资源网址。 开发中的网址示例为http://localhost:3000/resource/1,由resource_url(resource) url_helper 生成。

我在生产中使用nginx来 proxy_pass 对我的rails应用程序的请求。我的nginx侦听端口433 https并重定向到端口5000 http:

上的rails应用程序
server {
  listen 443 ssl;
  server_name     api.staging.zup.me;

  ssl_certificate /etc/ssl/certs/cert.crt;
  ssl_certificate_key /etc/ssl/certs/cert.key;

  location / {
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass      http://localhost:5000;
  }
}

因为我的Rails应用程序从nginx代理收到的请求是 http ,所以它生成的网址如http://example.com/resource/1,但仅在生产中我希望我的所有网址都使用< strong> https ,例如https://example.com/resource/1

让Rails仅在生产中使用 https 协议生成网址的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以在nginx中使用重定向,并且永远不要触摸rails应用以启用https:

server {
  listen 80 default_server deferred;
  server_name myserver.domain;

  return 301 https://$server_name$request_uri;  # enforce https
}

# HTTPS server
server {
  listen 443;
  server_name myserver.domain;
  ssl on;
  ssl_certificate /etc/nginx/ssl/myserver.domain.crt;
  ssl_certificate_key /etc/nginx/ssl/myserver.domain.key;

  root /srv/www/myserver;
  ...
}

不确定这是否是最佳方式,但我喜欢它,因为你不必对rails app做任何事情,只有nginx。