如何使用nginx设置从http到https的重定向?

时间:2014-01-30 22:58:31

标签: ruby-on-rails ruby http nginx https

我整天都在和这个问题作斗争。 这是我的nginx.cong

upstream my_website.co {
      server 127.0.0.1:8080;
    }

    server{
      listen 80;
      listen  443 default ssl;
      # return 301 https://www.my_website.co; - I put it here, but it didn't work  

      ssl on;
      ssl_certificate      /etc/nginx/certs/my_website.co.crt;
      ssl_certificate_key  /etc/nginx/certs/my_website.co.private.key;

      server_name my_website.co _;

      root /home/deployer/my_website/public;

      location / {
        proxy_set_header X_FORWARDED_PROTO $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   CLIENT_IP         $remote_addr;

        if (!-f $request_filename) {
          proxy_pass http://my_website.co;
          break;
        }
        if (-f $document_root/system/maintenance.html) {
          return 503;
        }
      }
      # return 301 https://www.my_website.co; - I put it here, but it didn't work  

您能否帮助我,如何将所有内容从http重定向到https

我的Rails代码:

的ApplicationController

before_filter :ensure_domain
APP_DOMAIN = 'www.my_website.co'
  def ensure_domain
    if request.env['HTTP_HOST'] != APP_DOMAIN && Rails.env != 'development'
      redirect_to "https://#{APP_DOMAIN}#{request.env['REQUEST_PATH']}", :status => 301
    end
  end

我会感激所有的帮助,我迷失在这里。

谢谢

3 个答案:

答案 0 :(得分:1)

我在我的一个网站上的nginx配置文件中做了类似的事情,它没有问题。我的ApplicationController中没有任何东西可以强制重定向。

server {
            listen 80;
            server_name my_website.co;
            rewrite ^ https://server_name$request_uri? permanent;
    }

server {
            listen 80;
            server_name www.my_website.co;
            rewrite ^ https://server_name$request_uri? permanent;
    }

server {
            listen       443;
            server_name  my_website.co;
            root /home/deployer/my_website/public;

            ssl on;
            ssl_certificate      /etc/nginx/certs/my_website.co.crt;
            ssl_certificate_key  /etc/nginx/certs/my_website.co.private.key;

            // rest of your config file below
    }

答案 1 :(得分:0)

您拥有的服务器部分应该只侦听端口443,因此请在Nginx配置中从端口80中删除端口80。然后将这样的新服务器部分添加到您的Nginx配置文件中:

server {
    listen 80;
    server_name my_site.co;
    rewrite ^ https://$server_name$request_uri? permanent;
}

然后Nginx会将所有内容重定向到SSL版本。您可以删除ApplicationController中的代码。

答案 2 :(得分:0)

在Rails 4中我们可以直接在application.rb

中执行此操作
config.force_ssl = true

无需使用nginx配置文件。