Nginx配置domain.com/api路由到Laravel(PHP-FPM)且保留React正常访问
核心问题原因
你现有配置的问题主要有2点:
- 全局的
.php正则location在处理/api路径下的请求时,SCRIPT_FILENAME路径拼接错误,php-fpm找不到对应文件,导致直接返回PHP源码 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
相关产品推荐
相关产品推荐

