我目前在 AWS Application Load Balancer 后面运行 nginx。我在另一台服务器上有一个 ghost 博客,我使用 proxy_pass 设置了它。如果我去https://www.example.com/blog
不过,我有一个链接https://www.example.com/blog在我的主页上,但当我点击它时,它似乎将我 301 重定向到http://www.example.com:443/blog导致“纯 HTTP 请求已发送至 HTTPS 端口”
该网站还设置为 301 HTTP 转 HTTPS。这似乎运行得很顺畅。
ALB 负责管理我的 SSL 证书。为了简单起见,我为 ALB 设置了两个侦听器(80 和 443),但只有一个进程(80)。我之前将 443 设置为另一个进程,但为了减少潜在的故障点,我将其删除了。
我很困惑为什么它会通过将一个完美的 URL 转换为端口 443 上的 HTTP 来对其进行 301 处理,而在所有其他情况下它似乎都会将 HTTP 转换为 HTTPS。
一些建议的答案是将 listener 443 ssl; 添加到 nginx.conf,但我无法这样做,因为 nginx 上没有设置 SSL 证书。一切都在 ALB 上。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server{
listen 80;
listen 443;
server_name example.com;
return 301 https://www.example.com;
}
server {
listen 80;
listen 443;
server_name www.example.com;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
sendfile on;
default_type application/octet-stream;
gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 256;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 9;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /blog/$uri;
}
location /blog/ {
proxy_pass https://ip.address;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
include servers/*;
}
有任何想法吗??
答案1
好的,这对我有用:
我添加port_in_redirect off;
到了第二个服务器块。
带有附加 :433 端口的代理传递似乎没有影响。该问题似乎与此有关:https://serverfault.com/a/905740/201084
答案2
proxy_pass
处理https
/作为协议说明符,代理到端口http
时需要设置端口:
https
443
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
proxy_pass https://ip.address:443;
也不要做if
,它们是邪恶的:https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/server
更好的方法是为请求添加不同的方法http
:
server {
listen 80;
return 302 https://$host$uri;
}
不要$request_uri
在那里使用,这样你就支持通过未加密的链接发送参数。剥离它们会让人们寻找错误原因并用它https
来链接到你的网站。