自从给自己的图床服务加上了 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,解决重定向请求方法不正确的问题。