我有一个常规实例,当没有负载均衡器时,它可以正常工作。我设置了一个 ELB,将 80 转发到 80,将 443 转发到 443,并设置了粘性会话。之后,当我访问任何 https 页面时,都会收到此错误。
The plain HTTP request was sent to HTTPS port
我在 nginx 配置中处理在某些页面上强制使用 https 的过程。我需要做什么才能使其正常工作?我在下面输入了我的 nginx 配置的准系统版本。
http {
include mime.types;
default_type application/octet-stream;
# Directories
client_body_temp_path tmp/client_body/ 2 2;
fastcgi_temp_path tmp/fastcgi/;
proxy_temp_path tmp/proxy/;
uwsgi_temp_path tmp/uwsgi/;
server {
listen 443;
ssl on;
ssl_certificate ssl.crt;
ssl_certificate_key ssl.key;
server_name www.shirtsby.me;
if ($host ~* ^www\.(.*)) {
set $host_without_www $1;
rewrite ^/(.*) $scheme://$host_without_www/$1 permanent;
}
location ~ ^/(images|img|thumbs|js|css)/ {
root /app/public;
}
if ($uri ~ ^/(images|img|thumbs|js|css)/) {
set $ssltoggle 1;
}
if ($uri ~ "/nonsecure") {
set $ssltoggle 1;
}
if ($ssltoggle != 1) {
rewrite ^(.*)$ http://$server_name$1 permanent;
}
location / {
uwsgi_pass unix:/site/sock/uwsgi.sock;
include uwsgi_params;
}
}
server {
listen 80;
server_name www.shirtsby.me;
if ($host ~* ^www\.(.*)) {
set $host_without_www $1;
rewrite ^/(.*) $scheme://$host_without_www/$1 permanent;
}
if ($uri ~ "/secure") {
set $ssltoggle 1;
}
if ($ssltoggle = 1) {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
location ~ ^/(images|img|thumbs|js|css)/ {
root /app/public;
}
location / {
uwsgi_pass unix:/home/ubuntu/site/sock/uwsgi.sock;
include uwsgi_params;
}
}
}
答案1
最后在 nginx IRC 频道中从 vandemar 那里得到了答案。看起来很简单,但我费了好大劲才搞明白。ELB 正在处理 SSL,我已经给了它所有的证书信息。问题是试图在单个实例上或配置文件中再次处理它。解决方案是从配置文件中删除所有 SSL 内容。因此,删除这三行可以解决所有问题:
ssl on;
ssl_certificate ssl.crt;
ssl_certificate_key ssl.key;
答案2
对我来说,我使用 CloudFormation 设置负载均衡器。InstanceProtocol
默认为 HTTP,而我没有设置该参数。这是修复方法:
ElasticLoadBalancer:
Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
Properties:
Listeners:
- LoadBalancerPort: '443'
Protocol: HTTPS
InstancePort: '443'
InstanceProtocol: HTTPS
答案3
我遇到了同样的问题。但后来我注意到我的 elb-listener 配置不正确。我设置了负载均衡器协议:https、负载均衡器端口:443、实例端口:443,但忘记将实例协议从 http 更改为 https。