Nginx配置中PUT请求出现405 Method Not Allowed错误的排查与解决
问题原因及解决方案
核心原因
你的Nginx配置中,全局的if (!-e $request_filename)规则与location /内的try_files逻辑存在冲突,同时PUT请求被Nginx静态文件处理模块拦截——当请求目标不是真实存在的文件时,Nginx默认会拒绝PUT方法访问静态资源路径,直接返回405,并未将请求正确转发到PHP后端处理。
另外,add_header指令仅在响应码为2xx或3xx时生效,但这不是触发405的直接原因,属于配置细节问题。
修复步骤
修改Nginx server配置,调整请求转发逻辑,确保PUT请求能被正确传递到PHP:
server { listen 443 ssl default_server; root /opt/bitnami/nginx/html/web; server_name servername.com; ssl_certificate /opt/bitnami/nginx/conf/servername.com.crt; ssl_certificate_key /opt/bitnami/nginx/conf/servername.com.key; location / { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT'; add_header 'Access-Control-Allow-Headers' 'DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, cache-control, expires, pragma'; add_header 'Access-Control-Max-Age' 86400; if ($request_method = OPTIONS) { return 204; } # 移除全局if规则,统一在此处理请求转发 try_files $uri $uri/ @php_handler; } # 专门处理需转发到PHP的请求,覆盖PUT等所有方法 location @php_handler { rewrite ^/(.+)$ /index.php?q=$1 last; } # 确保PHP接收并处理所有请求方法 location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/opt/bitnami/php/var/run/www.sock; # 若为TCP端口则改为127.0.0.1:9000,可查看bitnami/php.conf确认路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; # 显式传递请求方法给PHP } include "/opt/bitnami/nginx/conf/bitnami/*.conf"; }
额外检查点
- 确认Bitnami PHP-FPM路径正确:可查看
/opt/bitnami/nginx/conf/bitnami/php.conf内的配置,匹配实际的sock或端口地址。 - 重启Nginx后重新测试PUT请求:
curl --location --request PUT 'https://servername.com/wp/?rest_route=%2Fsimple-jwt-login%2Fv1%2Fuser%2Freset_password&email=mail@mail.com&code=securecode&new_password=123456' - 验证Simple JWT Login插件是否支持PUT方法:部分REST接口可能仅接受POST,可尝试改用POST请求携带参数测试,确认后端逻辑正常。
内容的提问来源于stack exchange,提问作者Saul
相关产品推荐
相关产品推荐

