生产环境下React表单POST请求返回index.html问题求助
问题:React联系表单部署后POST请求返回index.html
我开发了一个基于React的简易联系表单,搭配PHP接口实现给填表用户发送邮件的功能。本地环境运行正常,可正常发送邮件,但部署到生产环境后,表单的POST请求返回的是React项目的index.html文件。
React代码
import React, { Fragment, useState } from 'react'; import axios from 'axios'; const Form = () => { const [userData, setUserData] = useState({ name: '', entity: '', email: '', phone: '', message: '' }) const handleInputChange = (event) => { setUserData({ ...userData, [event.target.name]: event.target.value }) } const sendData= (event) => { event.preventDefault(); const url = 'https://mydomain.org.co/api_contact/?contact=1'; axios.post(url, userData) .then(response => { let data = response.data; console.log("data:", data); }) } return ( <Fragment> {/* ... FORM CODE */} </Fragment> ); } export default Form;
服务器public_html目录结构
public_html目录下包含api_contact文件夹(存放PHP接口文件)、React项目的静态资源文件夹(如css、js),以及index.html、.htaccess等文件。
.htaccess文件内容
RewriteOptions inherit <IfModule mime_module> AddHandler application/x-httpd-ea-php56 .php .php5 .phtml </IfModule> Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.html [QSA,L]
解决方案
问题根源在.htaccess的Rewrite规则:当前规则会把所有不存在的文件请求都重定向到index.html,包括你的PHP接口请求——服务器没有优先处理api_contact目录下的PHP文件,反而被React的路由重写规则覆盖了。
可以按以下步骤修复:
- 修改Rewrite规则,排除API目录
在现有规则前添加一条规则,让api_contact目录下的请求直接访问实际文件,不再走React的重写逻辑:
RewriteOptions inherit <IfModule mime_module> AddHandler application/x-httpd-ea-php56 .php .php5 .phtml </IfModule> Options -MultiViews RewriteEngine On # 新增:匹配api_contact目录的请求,直接跳过后续重写 RewriteRule ^api_contact/ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.html [QSA,L]
- [L]表示匹配到该规则后立即停止后续Rewrite处理,直接返回请求的文件内容。
- 检查PHP接口的可用性
- 确认
api_contact文件夹下存在对应PHP文件(比如index.php),文件权限设为644确保服务器能读取。 - 验证PHP版本兼容性:当前配置的是PHP5.6,确保接口代码没有使用该版本不支持的语法。
- 验证请求路径
直接在浏览器访问https://mydomain.org.co/api_contact/?contact=1,确认返回的是PHP接口的响应内容,而非React的index.html。
内容的提问来源于stack exchange,提问作者Dayamon5
相关产品推荐
相关产品推荐

