NGINX 在 AWS ALB 后面使用 proxy_pass,从 https 链接创建 http://example.com:443 url - “纯 HTTP 请求已发送到 HTTPS 端口”

NGINX 在 AWS ALB 后面使用 proxy_pass,从 https 链接创建 http://example.com:443 url - “纯 HTTP 请求已发送到 HTTPS 端口”

我目前在 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时需要设置端口: https443http://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来链接到你的网站。

相关内容