Принудительное использование NGINX и SSL через маршруты в Rails

#ruby-on-rails #ruby #nginx #passenger

#ruby-on-rails #ruby #nginx #пассажир

Вопрос:

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

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

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

 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. Есть ли причина не использовать rack-ssl или аналогичное промежуточное программное обеспечение? Если ваши файлы cookie передаются вообще без SSL, то вы в любом случае уязвимы для атаки в стиле firesheep.

2. @codatory Они принудительно используют SSL на всех маршрутах (я хочу использовать SSL только на определенных маршрутах).

3. Вы получаете ошибку при прямой навигации как с использованием SSL, так и без него

Ответ №1:

Я не уверен, что это правильный подход к вашей проблеме, но в моем 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 wiki.

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

Комментарии:

1. Я действительно пытаюсь интегрировать это с кодом Rails, чтобы я мог принудительно использовать SSL из своего файла routes. Спасибо.