根据部署类型更改Rails路由

时间:2009-10-05 19:29:10

标签: ruby-on-rails deployment routing

是否有基于部署类型修改路由的好方法?

基本上,我的路线有:requirements => {:protocol => “https”},我希望这只发生在制作中,而不是发展中。

3 个答案:

答案 0 :(得分:17)

您可以单独明确定义它们并测试环境

  if Rails.env.production?
    map.resources :purchases, :requirements => {:protocol => "https"}
  else
    map.resources :purchases
  end

注意,如果您使用的是旧版本的Rails,请使用ENV ['RAILS_ENV'] ==生产

答案 1 :(得分:3)

在路径文件的顶部添加一个常量,如:

ROUTES_PROTOCOL = (Rails.env.production? ? "https" : "http")

然后就这样做:

:protocol => ROUTES_PROTOCOL 

表示需要https的路由

答案 2 :(得分:0)

最好坚持当前的协议。

如果您的生产环境涉及静态资产和ssl的apache或nginx,请确保在客户端查询位于https端口时将X-FORWARDED_PROTO https标头发送给工作者。

通过这种方式,工作人员将成为ssl在外部进行实际处理的软件,并且可以使用正确的协议生成链接。

我知道在serverfault上会比这更好,但是这里有一个示例nginx配置文件,它强制https并为unicorn worker中的ssl管理设置正确的头:

upstream WEBAPP_NAME {
      server unix:/path/to/webapp/tmp/sockets/unicorn.sock fail_timeout=0;
    }

server {
    listen       4343;
    server_name  example.com;

    root /path/to/webapp/public;
    access_log /path/to/logs/nginx-access.log;
    error_log /path/to/logs/nginx-error.log;
    rewrite_log on;

    ssl                  on;
    # redirect when http request is done on https port
    error_page 497 https://example.com:4343$request_uri;
    ssl_certificate      cert.pem;
    ssl_certificate_key  cert.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

 location ~ ^/assets/ {
      expires 1y;
      add_header Cache-Control public;

      add_header ETag "";
      break;
    }


 location / {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-FORWARDED_PROTO https;

          proxy_pass http://WEBAPP_NAME;
          proxy_redirect default;
        }
}