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

React+Webpack+PHP+Apache项目:API置于public外的AJAX路径问题

解决React+PHP同项目下API的相对路径请求问题

首先咱们先明确下典型的项目结构,这样更容易理解配置逻辑:

your-project/
├── src/          # React的源码目录
├── public/       # React打包后的静态资源目录,同时是Apache的根目录
├── api/          # 你的PHP API文件目录(和src同级,在public上方)
│   └── example.php
└── webpack.config.js

第一步:调整Apache的重定向规则

因为你之前配置的是把所有请求都重定向到public目录,现在需要让Apache能识别API请求,把它转发到上层的api目录,而不是都指向React的index.html。

你可以在public目录下创建或修改.htaccess文件,添加以下规则:

# 优先处理API请求:如果请求路径以/api/开头,转发到上层的api目录
RewriteRule ^api/(.*)$ ../api/$1 [L]

# 处理React单页应用的路由:非文件/目录的请求都指向index.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]

这段规则的逻辑是:先检查请求是不是/api开头的,如果是,就把请求转发到项目根目录下的api文件夹;如果不是静态文件或目录,再交给React的单页路由处理。

第二步:开发环境的Webpack代理配置

开发时你应该是用Webpack Dev Server跑React的,这时候Dev Server和Apache是两个不同的服务(比如Dev Server在localhost:8080,Apache在localhost:80),所以需要配置代理,让Dev Server把/api开头的请求转发到Apache的PHP服务上。

在webpack.config.js里添加devServer的代理配置:

module.exports = {
  // ...其他Webpack配置项
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost', // 这里填你的Apache服务器地址
        changeOrigin: true,
        pathRewrite: { '^/api': '/api' } // 保持请求路径不变
      }
    }
  }
};

第三步:在React中使用相对路径请求API

做完上面两步后,不管是开发环境还是生产环境,你都可以直接用/api/xxx这样的相对路径来发起AJAX请求了。举个例子:

用fetch的例子

fetch('/api/example.php')
  .then(res => res.json())
  .then(data => {
    console.log('API返回的数据:', data);
  })
  .catch(err => {
    console.error('请求出错:', err);
  });

用axios的例子

import axios from 'axios';

axios.get('/api/example.php')
  .then(res => {
    console.log('API返回的数据:', res.data);
  })
  .catch(err => {
    console.error('请求出错:', err);
  });

这样配置后,生产环境中Apache会自动把/api/example.php的请求转发到项目根目录下的api/example.php文件;开发环境中Webpack Dev Server会把这个请求代理到Apache的PHP服务上,完美实现同项目下的API请求,不用分开部署。

内容的提问来源于stack exchange,提问作者i.brod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:20:19