Применение NGINX и SSL через маршруты в Rails - PullRequest
1 голос
/ 21 октября 2011

У меня есть следующий фрагмент, который отлично работает на Heroku (производство) для принудительного применения SSL:

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

Я пытаюсь настроить машину разработки с использованием NGINX и пассажиров с SSL, однако получаю:1004 *

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

Я получаю зеленый SSL в Chrome при просмотре других разделов приложения с помощью HTTPS, поэтому кажется, что 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 Ответ

1 голос
/ 28 октября 2011

Я не уверен, что это правильный подход к вашей проблеме, но в моем nginx.conf я буду стремиться
переписать пространство URL, которое я хотел бы использовать по умолчанию на 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, когда вы намерены использовать его на самом деле;)

Для получения дополнительной информации вы можете посмотретьв HttpRewriteModule на вики nginx.

Надеюсь, это полезно для вашего случая.

...