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

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';
    }
}

关键调整说明

  1. 动态Connection头:通过map指令仅在需要WebSocket升级时设置Connection: upgrade,避免干扰常规HTTP请求
  2. OPTIONS请求独立处理:直接返回204状态码和完整CORS头,确保浏览器预请求验证通过
  3. CORS头兼容性:若使用Nginx 1.7.5及以上版本,可在add_header后添加always参数,确保错误响应也能返回CORS头

Laravel端确认事项

  • 确保.env中TRUST_PROXIES配置正确(如TRUST_PROXIES=*或具体代理IP),让Laravel正确识别代理后的请求方法和地址
  • 确认API路由已禁用CSRF验证(用户已完成此配置)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:44:55