You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenResty中启用POST方法?解决图片上传405错误

OpenResty上传图片返回405 Method Not Allowed问题解决

问题现象

使用OpenResty作为后端上传图片时,服务器返回405 Method Not Allowed错误,测试用curl命令如下:

➜  ~ curl 'https://zj.example.top/snap/upload' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Accept-Language: en,zh-CN;q=0.9,zh;q=0.8,zh-TW;q=0.7,fr;q=0.6' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundarynh7LVePlxCWGPohC' \
  -H 'DNT: 1' \
  -H 'Origin: https://zj.example.top' \
  -H 'Referer: https://zj.example.top/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' \
  -H 'sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  -H 'sec-gpc: 1' \
  -H 'x-request-id: d20d67d4-c52d-44cb-9ccd-8fd6d0879e0e' \
  --data-raw $'------WebKitFormBoundarynh7LVePlxCWGPohC\r\nContent-Disposition: form-data; name="file"; filename="OIP-C.jpeg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundarynh7LVePlxCWGPohC--\r\n' \
  --compressed
<html>
<head><title>405 Not Allowed</title></head>
<body>
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.21.1</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->

当前Nginx配置

已尝试添加allow all;但问题仍未解决,当前配置如下:

server {
    listen       443 ssl;
    server_name  zj.example.top;

    ssl_certificate /etc/letsencrypt/live/example/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example/privkey.pem;
    allow all;
    if ($allowed = 0) {
        return 403;
    }

    location / {
        client_max_body_size 1m;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP 192.210.203.237;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 3600;
        proxy_pass http://127.0.0.1:8000;
    }

    location ^~ /snap {
        allow all;
        client_max_body_size 500k;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 3600;
        proxy_pass http://127.0.0.1:8000;
    }
}

OpenResty版本信息

[root@k8smasterone curl-8.0.1]# /usr/local/openresty/bin/openresty -V
nginx version: openresty/1.21.4.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.1 --add-module=../echo-nginx-module-0.62 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.33 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.09 --add-module=../srcache-nginx-module-0.32 --add-module=../ngx_lua-0.10.21 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.9 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.11 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --with-http_ssl_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module

解决方法

405错误核心是请求方法不被允许,allow all;仅控制IP访问权限,和请求方法无关,按以下步骤修复:

  1. 移除无效配置:服务器块中的allow all;和if ($allowed = 0) { return 403; }无实际作用($allowed变量未定义),直接删除避免干扰。

  2. 显式允许POST请求:在/snap的location块中添加limit_except指令,明确允许GET和POST方法(可按需添加PUT、DELETE等其他方法):

location ^~ /snap {
    allow all;
    client_max_body_size 500k;
    # 允许GET和POST请求,拒绝其他未列出的方法
    limit_except GET POST {
        deny all;
    }
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 3600;
    proxy_pass http://127.0.0.1:8000;
}
  1. 验证后端服务兼容性:直接测试后端服务(127.0.0.1:8000)是否支持POST请求到/snap/upload路径,执行命令:
curl http://127.0.0.1:8000/snap/upload -X POST -F "file=@OIP-C.jpeg"

如果后端返回405,说明是后端服务未配置该路径的POST处理,需调整后端路由逻辑。

  1. 检查其他拦截规则:确认Nginx配置中没有全局或location级别的规则(如安全模块、rewrite规则)拦截POST请求。

修改配置后,执行/usr/local/openresty/bin/openresty -s reload重载配置,重新测试上传即可。

内容的提问来源于stack exchange,提问作者spark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:04:54