通过Rails中的路由进行NGINX和SSL实施

时间:2011-10-21 05:47:22

标签: ruby-on-rails ruby nginx passenger

我有以下代码段在Heroku(生产)上正常工作以强制执行SSL:

# /config/routes.rb
scope protocol: 'https://', constraints: { protocol: 'https://' } do 
  resource :user
  resource :session
end

我正在尝试使用NGINX和使用SSL的乘客设置开发机器,但我得到:

Action Controller: Exception
No Route Matches [GET] "/session/new"

使用HTTPS浏览到应用程序的其他部分时,我在Chrome中获得了绿色SSL,因此SSL正常运行。由于某些原因,通过路线强制执行不正确匹配。我的nginx.conf是:

worker_processes 4;

events {
  worker_connections 1024;
}

http {

  gzip on;
  sendfile on;

  include mime.types;

  ssl_certificate     cert.crt;
  ssl_certificate_key cert.key;

  ssl_session_cache   shared:SSL:10m;
  ssl_session_timeout 10m;

  keepalive_timeout 60;

  rack_env development;
  passenger_user kevin;
  passenger_root /Users/kevin/.rvm/gems/ruby-1.9.2-p290/gems/passenger-3.0.9;
  passenger_ruby /Users/kevin/.rvm/wrappers/default/ruby;

  server {
    listen 80;
    listen 443 ssl;
    server_name local.demo;
    location / {
      root /Users/kevin/Sites/demo/public;
      passenger_enabled on;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Ssl on;
      proxy_set_header X-Forwarded-Proto https;
    }
  }

}

任何想法如何解决?

1 个答案:

答案 0 :(得分:1)

我不确定这是否适合您的问题,但在我的nginx.conf中我会倾向于 预先重写我要默认为https的网址空间:

server {
  listen 80;
  server_name local.demo;
  rewrite ^(.*)$ https://local.demo$1 permanent;
}

server {
  listen 443 ssl;
  server_name local.demo;
  location / {
    root /Users/kevin/Sites/demo/public;
    passenger_enabled on;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_set_header X-Forwarded-Proto https;
  }
}

此设置会强制http://local.demo/上的所有请求通过https://local.demo。 或者,您可以更具体,并根据位置或模式匹配进行过滤:

location ~ ^/sslrequired/(.*)$ {
   rewrite ^(.*)$ https://local.demo/$1 permanent;
}

以通用的方式,它可以被视为一种解决方法,但为什么不让服务器强制执行 当您打算让用户实际使用它时的SSL;)

有关更多信息,您可能需要查看nginx wiki上的HttpRewriteModule

我希望这对你的情况有帮助。