我有以下代码段在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;
}
}
}
任何想法如何解决?
答案 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。
我希望这对你的情况有帮助。