我在乘客/ nginx后面运行一个Sinatra应用程序。我试图让它响应http和https调用。问题是,当两者都在服务器块中定义时,https呼叫正常响应但http产生400“普通HTTP请求被发送到HTTPS端口”错误。这是一个静态页面,所以我猜Sinatra与此无关。关于如何解决这个问题的任何想法?
这是服务器块:
server {
listen 80;
listen 443 ssl;
server_name localhost;
root /home/myhome/app/public;
passenger_enabled on;
ssl on;
ssl_certificate /opt/nginx/ssl_keys/ssl.crt;
ssl_certificate_key /opt/nginx/ssl_keys/ssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location /static {
root /home/myhome/app/public;
index index.html index.htm index.php;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 /500.html;
access_log /home/myhome/app/logs/access.log;
error_log /home/myhome/app/logs/error.log;
}
答案 0 :(得分:186)
我遇到了类似的问题。它适用于一台服务器,不适用于具有相同Nginx配置的其他服务器。找到了Igor在http://forum.nginx.org/read.php?2,1612,1627#msg-1627
回答的解决方案是。或者您可以在一台服务器中组合SSL /非SSL服务器:
server {
listen 80;
listen 443 default ssl;
# ssl on - remember to comment this out
}
答案 1 :(得分:30)
以上答案是错误的,因为大多数覆盖'这是连接HTTPS'测试,以允许通过http提供页面而不管连接安全性。
安全答案使用NGINX特定的http 4xx错误代码上的错误页面重定向客户端以重试相同的请求到https。 (如此处所述https://serverfault.com/questions/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx)
OP应该使用:
server {
listen 12345;
server_name php.myadmin.com;
root /var/www/php;
ssl on;
# If they come here using HTTP, bounce them to the correct scheme
error_page 497 https://$host:$server_port$request_uri;
[....]
}
答案 2 :(得分:16)
错误说明了一切。您的配置告诉Nginx侦听端口80(HTTP)并使用SSL。当您将浏览器指向http://localhost
时,它会尝试通过HTTP进行连接。由于Nginx需要SSL,因此会抱怨错误。
解决方法非常简单。您需要两个server
部分:
server {
listen 80;
// other directives...
}
server {
listen 443;
ssl on;
// SSL directives...
// other directives...
}
答案 3 :(得分:12)
我有完全相同的问题,我有与你的例子相同的配置,我通过删除该行来实现它:
ssl on;
引用文档:
如果HTTP和HTTPS服务器相同,则可以通过删除指令“ssl on”并为*:443 port添加ssl参数来配置处理HTTP和HTTPS请求的单个服务器
答案 4 :(得分:7)
以下示例在 ipv6 支持的同一配置块中配置 HTTP 和 HTTPS 。配置在 Ubuntu Server 和 NGINX / 1.4.6 中进行测试,但这适用于所有服务器。
server {
# support http and ipv6
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
# support https and ipv6
listen 443 default_server ssl;
listen [::]:443 ipv6only=on default_server ssl;
# path to web directory
root /path/to/example.com;
index index.html index.htm;
# domain or subdomain
server_name example.com www.example.com;
# ssl certificate
ssl_certificate /path/to/certs/example_com-bundle.crt;
ssl_certificate_key /path/to/certs/example_com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
}
不要包含可能导致ssl on
错误的400
。上面的配置适用于
希望这有帮助!
答案 5 :(得分:4)
如果使用phpmyadmin add:fastcgi_param HTTPS on;
答案 6 :(得分:3)
实际上你可以这样做:
ssl off;
这解决了我使用nginxvhosts的问题;现在我可以使用SSL和普通HTTP。 甚至与组合端口一起工作。
答案 7 :(得分:0)
参考 https://serversforhackers.com/c/redirect-http-to-https-nginx
我有类似的问题
http://www.example.com给出400 error The plain HTTP request was sent to HTTPS
但是
如果我输入https://www.example.com可以正常工作,
当用户输入以下命令时,我想自动将http重定向到https: http://www.example.com
解决方案是
我制作了两个服务器块,一个用于端口80,另一个用于443 SSL 在端口80块中,请按照以下步骤操作server {
listen 80;
server_name example.com, www.example.com;
return 301 https://$host$request_uri;
}
和另一个用于ssl配置的端口443的服务器块
server {
location = /favicon.ico { access_log off; log_not_found off; }
listen [::]:443 ipv6only=on default_server ssl;
listen 443 ssl;
ssl on;
ssl_certificate /home/hemanth/vtuallinoneresources_com/example.crt;
ssl_certificate_key /home/hemanth/ssl/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
# add here the ip address of your server
# or a domain pointing to that ip (like example.com or www.example.com)
server_name www.example.com;
// continure rest code...
}