Nginx 负载均衡器并强制 HTTPS

Nginx 负载均衡器并强制 HTTPS

我有一台用作负载均衡器的 Nginx 服务器。我刚刚使用 Let's Encrypt 安装了一个 SSL 证书,现在正在研究强制使用 HTTP。以下是我的配置:

upstream backend {
   server one.example.com;
   server two.example.com;
}

server {
   server_name example.com;
   location / {
      proxy_pass http://backend;
      proxy_set_header Host               $host;
      proxy_set_header X-Forwarded-Host   $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP          $remote_addr;
      proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
   }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;

    server_name example.com;
    return 404; # managed by Certbot
}

https请求工作正常,但是http请求引发301 永久移动,访问日志显示以下内容:

[07/Feb/2019:15:28:11 +0000] <ip> -> - | POST /api/test HTTP/1.1 | upstream_response_time - msec | request_time 0.000 msec | status: 301
[07/Feb/2019:15:28:11 +0000] <ip> -> <one.example.com IP>:80 | GET /api/test HTTP/1.1 | upstream_response_time 0.007 msec | request_time 0.007 msec | status: 405

(我的日志格式是'[$time_local] $remote_addr -> $upstream_addr | $request | upstream_response_time $upstream_response_time msec | request_time $request_time msec | status: $status'

返回 301似乎正在将请求类型从 POST 修改为 GET(目标应用程序不允许)。我在非负载平衡 Web 服务器上进行了非常类似的设置,一切工作正常。

还需要注意的是,最终的配置文件是由 certbot 生成的。

答案1

您不能使用 301 重定向 POST(据我所知)。如果您想安全地发布某些内容(通过 https),请直接通过 https 进行 POST,就好像您在服务器上重定向到 https 一样,在您到达那里之前,POST 是不安全的。

我看到您可以做的另一件事是使用 307 而不是 301 进行重定向,这看起来可以保留 POST,但您会失去 301 带来的“永久”重定向。

第二部分的信息: https://stackoverflow.com/questions/39280361/nginx-loses-post-variable-with-http-https-redirect

但是我会实现第一个,如果您有证书,则可以通过 https 发布任何内容。

相关内容