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查到资料如下:

缓存(永久重定向不缓存(临时重定向)
转 GET301302、303
方法保持308307

经过替换状态码:301 换成 308,解决重定向请求方法不正确的问题。