Passenger,nginx and SSL(http redirect to https)

9 篇文章 0 订阅
5 篇文章 0 订阅

参见配置SSL

Nginx + https + 免费SSL证书配置指南

但是配置完后,rails中的request.ssl? 永远返回false


Passenger 3 implements this feature with a new directive passenger_set_cgi_param which behaves like proxy_set_header.

For example, to pass SSL variables to Rack, you could do this:

server {
  listen 443 default ssl;

  # other SSL stuff goes here
  # other passenger stuff here

  passenger_set_cgi_param  X_FORWARDED_PROTO       https;
  passenger_set_cgi_param  X-SSL-Raw-Cert          $ssl_client_raw_cert;
  passenger_set_cgi_param  X-SSL-Cert              $ssl_client_cert;
  passenger_set_cgi_param  X-SSL-Client-S-DN       $ssl_client_s_dn;
  passenger_set_cgi_param  X-SSL-Client-I-DN       $ssl_client_i_dn;
  passenger_set_cgi_param  X-SSL-Client-Verify     $ssl_client_verify;
}

然后重写Rack::Request.scheme方法:

module Rack
  class Request
    def scheme
          if self.headers['X_FORWARDED_PROTO'].eql?("https")
            'https'
          elsif @env['HTTPS'] == 'on'
            'https'
          elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
            'https'
          elsif @env['HTTP_X_FORWARDED_PROTO']
            @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
          else
            @env["rack.url_scheme"]
          end
        end
  end
end

在ApplicationController中添加代码

class ApplicationController < ActionController::Base
  before_filter :redirect_to_https
  def redirect_to_https
    unless(request.ssl?)
      redirect_to :protocol=>"https://"
      return
    end
  end
end

此时的request.ssl?就生效了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值