Laravel API部署后仅GET请求正常,POST/PUT/PATCH/DELETE失效求助
解决Laravel API反向代理后非GET请求失效的问题
问题根源
当前Nginx配置中存在两个关键问题:
- 无条件设置
Connection 'upgrade'头,该头仅用于WebSocket握手场景,会干扰POST/PUT/PATCH/DELETE等常规HTTP请求的正常处理 - 未显式处理OPTIONS预请求,导致浏览器无法正确发起后续非GET请求
修正后的Nginx配置
map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name api.example.com; # 直接处理OPTIONS预请求,无需转发到Laravel if ($request_method = OPTIONS) { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } location / { proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # 动态适配WebSocket和常规请求 proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Prefix /; # 为非OPTIONS请求添加CORS头 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type'; } }
关键调整说明
- 动态Connection头:通过
map指令仅在需要WebSocket升级时设置Connection: upgrade,避免干扰常规HTTP请求 - OPTIONS请求独立处理:直接返回204状态码和完整CORS头,确保浏览器预请求验证通过
- CORS头兼容性:若使用Nginx 1.7.5及以上版本,可在
add_header后添加always参数,确保错误响应也能返回CORS头
Laravel端确认事项
- 确保
.env中TRUST_PROXIES配置正确(如TRUST_PROXIES=*或具体代理IP),让Laravel正确识别代理后的请求方法和地址 - 确认API路由已禁用CSRF验证(用户已完成此配置)
内容的提问来源于stack exchange,提问作者Raxmatullo Erkinov
相关产品推荐
相关产品推荐

