Nginx 重定向 POST 变 GET
自从给自己的图床服务加上了 https 证书,给 typora 写的上传客户端就失效了,总是报错invalid character 'p' after top-level value
。报错位置是解析服务端返回值的位置,打印出来发现返回来的是404 page not found
。
经过排查日志后发现是状态码使用错误导致,重定向后请求方法错误。
首先贴上自己的 nginx 代理服务配置:
server {
listen 80;
server_name xxxxx.example.com;
location / {
return 301 https://xxxxx.example.com$request_uri;
}
}
server {
server_name xxxxx.example.com;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/xxxxx.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxxxx.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/xxxxx.example.com/fullchain.pem;
include /root/nginx/snippets/ssl.conf;
location / {
proxy_pass http://127.0.0.1:38579;
}
}
很明显这是一个 nginx 代理的 http 转 https 然后转发给 frp服务端 监听的内网主机服务。
客户端请求时,nginx 的 access.log 记录如下:
"POST /api/typoraclient/upload HTTP/1.1" 301 169 "-" "Go-http-client/1.1"
"GET /api/typoraclient/upload HTTP/1.1" 404 18 "http://xxxxx.example.com/api/typoraclient/upload" "Go-http-client/1.1"
根据配置文件看,这里收到 POST 请求后,返回 301 让客户端重定向到 https 的请求上,是成功返回了并且客户端也重新访问了。
但是重定向后的访问竟然是 GET !这就很奇怪了。
一通百度、Google查到资料如下:
缓存(永久重定向 | 不缓存(临时重定向) | |
---|---|---|
转 GET | 301 | 302、303 |
方法保持 | 308 | 307 |
经过替换状态码:301 换成 308,解决重定向请求方法不正确的问题。