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

Nginx配置domain.com/api路由到Laravel(PHP-FPM)且保留React正常访问

核心问题原因

你现有配置的问题主要有2点:

  1. 全局的.php正则location在处理/api路径下的请求时,SCRIPT_FILENAME路径拼接错误,php-fpm找不到对应文件,导致直接返回PHP源码
  2. location /api下的try_files fallback规则指向了根路径的/index.php,没有正确匹配到api目录下的Laravel入口文件

调整后的完整配置

删掉你原来的/api块和全局.php匹配块,替换为以下配置即可,原有location /的react代理规则保持不变:

# 匹配所有/api开头的请求,优先级高于普通正则匹配
location ^~ /api {
    alias /var/www/api/public;
    try_files $uri $uri/ @apiRewrite;

    # 嵌套PHP处理规则,仅对/api路径下的PHP文件生效
    location ~ \.php$ {
        resolver 127.0.0.11;
        set $api api;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass $api:9000;
        fastcgi_index index.php;
        include fastcgi_params; 
        fastcgi_param SERVER_NAME $host;
        # 修正脚本路径拼接逻辑,避免alias导致的路径错误
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        # 去掉URI中的/api前缀,适配Laravel默认路由规则
        fastcgi_param REQUEST_URI /$fastcgi_path_info?$query_string;
    }
}

# 专门处理Laravel路由重写
location @apiRewrite {
    rewrite ^/api/(.*)$ /api/index.php?$1 last;
}

# 原有react代理规则保持不变即可
location / {
    index index.html;
    root /var/www/app;
    resolver 127.0.0.11;
    set $reactjs reactjs;
    proxy_pass http://$reactjs:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

关键修改说明

  • 用^~ /api前缀匹配规则,保证所有/api开头的请求都走专属块处理,不会被其他全局规则拦截
  • 将PHP处理逻辑嵌套到/api块内部,避免路径冲突,同时减少不必要的全局规则匹配
  • 修正SCRIPT_FILENAME取值逻辑,替换容易出错的$request_filename为$document_root$fastcgi_script_name,保证php-fpm能正确找到Laravel入口文件
  • 新增重写规则自动去掉请求路径中的/api前缀,Laravel不需要额外配置路由前缀就能正常解析接口路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:05