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

ReactJS与PHP:通过PHP Curl获取数据时遇404错误求助

问题排查与解决方案

一、先确认请求路径是否正确

  • 前端fetch的相对路径是相对于当前页面的URL,而非本地项目结构。比如你的前端页面在http://localhost:4000/frontend/index.html,那backend/curlfile.php的实际请求地址是http://localhost:4000/backend/curlfile.php,先直接在浏览器访问这个地址:
    • 如果浏览器也返回404,说明服务器根目录配置错误:检查Apache/Nginx的根目录是否指向my-app,如果根目录设为frontend,backend目录不在根路径下,自然访问不到。需要调整服务器配置,把根目录改为my-app。
    • 如果浏览器能返回测试JSON,说明问题出在PHP的CURL请求逻辑上。

二、修复PHP CURL请求代码

如果路径没问题,但CURL调用5000端口服务失败,用下面的完整测试代码替换你的curlfile.php:

<?php
// 必须设置响应头为JSON格式,确保前端能正确解析
header('Content-Type: application/json');

$targetApi = 'http://localhost:5000/api-route';

// 初始化CURL
$ch = curl_init($targetApi);
// 要求返回响应内容而非直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 自动跟随重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

// 生产环境如果用HTTPS,必须开启SSL验证;本地测试可暂时注释下面两行
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// 捕获CURL错误
if (curl_errno($ch)) {
    echo json_encode(['error' => 'CURL请求失败:' . curl_error($ch)]);
} else {
    // 检查目标API的响应状态码
    if ($httpCode === 200) {
        echo $response;
    } else {
        echo json_encode(['error' => '目标API返回错误,状态码:' . $httpCode]);
    }
}

curl_close($ch);
?>
  • 先检查PHP是否开启CURL扩展:在curlfile.php顶部加var_dump(function_exists('curl_init'));,返回bool(true)才是正常的,否则需要在php.ini中开启extension=curl。

三、服务器配置调整(针对生产环境)

Apache配置

  • 确保mod_rewrite模块开启,在my-app目录下的.htaccess文件中添加规则,允许访问backend目录:
    RewriteEngine On
    # 不拦截backend路径的请求
    RewriteRule ^backend/ - [L]
    # 前端路由重写(如果是SPA)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ frontend/index.html [L]
    

Nginx配置

  • 配置location规则,确保/backend路径能正确解析PHP文件:
    server {
        listen 4000;
        root /实际路径/my-app;
        index index.html index.php;
    
        # 前端SPA路由处理
        location /frontend {
            try_files $uri $uri/ /frontend/index.html;
        }
    
        # 后端PHP处理
        location /backend {
            try_files $uri $uri/ =404;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 根据你的PHP版本调整
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    

四、生产环境额外注意事项

  • 不要用localhost访问5000端口的服务(如果主应用和该服务不在同一服务器),改用实际IP或域名,同时确保服务器之间的防火墙允许5000端口通信。
  • 前端直接调用5000端口服务在生产环境会触发跨域拦截,所以PHP代理是正确的方案,必须保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:45:04