我有一台用作负载均衡器的 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 发布任何内容。