我正在尝试部署一个仅具有 https 访问权限而没有 http 访问权限的网站。我确信我只是在配置文件中遗漏了一些简单的行。
正如标题所说,它是 nginx 0.7.65 上的 Sinatra 0.9.4 到 Passenger 2.2.9。
Sinatra 服务的主要 ruby 文件包含:
require 'ssl_requirement'
def ssl_required?
true
end
config.ru 有(虽然我不确定它是否相关):
require 'rubygems'
require 'sinatra'
require 'app.rb'
set :environment, :production
run Sinatra::Application
nginx.conf 文件如下所示:
worker_processes 1;
events {
worker_connections 1024;
}
http {
passenger_root /var/lib/gems/1.8/gems/passenger-2.2.9;
passenger_ruby /usr/bin/ruby1.8;
include mime.types;
default_type application/octet-stream;
# HTTPS server
#
server {
listen 80;
listen 443;
server_name an.internal.ip.address;
root /my/app/dir/public;
passenger_enabled on;
proxy_set_header X_FORWARDED_PROTO https;
ssl on;
ssl_certificate /my/app/dir/certificate.pem;
ssl_certificate_key /my/app/dir/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
}
}
我没有将所有 http 请求重定向到 https,而是收到错误:
The plain HTTP request was sent to HTTPS port
我该如何修复这个问题?https 请求https://an.internal.ip.address工作正常。
(这也发生在 nginx-0.6.36 中,不管这值得)。
不确定这是否应该与 Sinatra 标记,但我还没有足够的声誉。
答案1
如果你输入http://服务器/浏览器通过端口 80 向服务器发送纯文本请求。而如果你输入https://服务器/它会向端口 443 发送加密请求。您所做的就是向 https 发送纯文本,因此 Web 服务器需要加密,但却得到纯文本。
如果你这样做的话https://服务器:80/,因此网络浏览器知道它需要加密,但发送到 80。我怀疑您是否能从用户那里得到这一点。
你想要的是,在 80 上接受未加密的流量,然后将所有请求 http 重定向到 443。在 nginx 中:
server {
listen server_ip:80;
server_name server_name;
location / {
rewrite ^/(.*) https://server_name permanent;
}
}