Nginx 重定向 POST 变 GET

自从给自己的图床服务加上了 https 证书,给 typora 写的上传客户端就失效了,总是报错invalid character 'p' after top-level value。报错位置是解析服务端返回值的位置,打印出来发现返回来的是404 page not found

经过排查日志后发现是状态码使用错误导致,重定向后请求方法错误。

首先贴上自己的 nginx 代理服务配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 记录如下:

1
2
"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,解决重定向请求方法不正确的问题。