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

使用AJAX+PHPMailer提交表单时遭遇405(Method Not Allowed)错误求助

问题:AJAX提交申请表单时出现405(Method Not Allowed)错误

我用AJAX+PHPMailer开发申请表单,提交时触发405错误,页面弹出提示‘An error has occurred’,这意味着response.ok为false。我怀疑服务器能识别请求方法,但无法正常返回响应,求问题原因和解决办法。


相关代码

JS文件中的formSend函数

document.addEventListener('DOMContentLoaded', function() {
   const form = document.getElementById('form')
   const wrapper = document.getElementById('wrapper')
   form.addEventListener('submit', formSend)

   async function formSend(e) {
      e.preventDefault()
   
      let error = formValidate(form)
      let formData = new FormData(form)

      if (error === 0) {
         form.classList.add('_sending')
         wrapper.classList.add('_sending')
         let response = await fetch('sendmail.php', {
            method: 'POST',
            body: formData
         })
         if (response.ok) {
            let result = await response.json()
            alert(result.message)
            form.reset()
            form.classList.remove('_sending')
            wrapper.classList.remove('_sending')
         } else {
            console.log(response.status)
            alert('An error has occurred')
            form.classList.remove('_sending')
            wrapper.classList.remove('_sending')
         }
      } else {
         alert('Check all inputs and try again')
      }
   }

sendmail.php代码

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';

$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->setLanguage('uk', 'phpmailer/language/');
$mail->IsHTML(true);

$mail->setFrom('info@fls.guru', 'форма заявки');
$mail->addAddress('kenici780@gmail.com');
$mail->Subject = 'Новая заявка!';

$body = '<h1>Новая заявка!</h1>';

if (trim(!empty($_POST['name']))){ 
   $body.= '<p>Имя: '.$_POST['name'].'</p>';
}
if (trim(!empty($_POST['surename']))){ 
   $body.= '<p>Фамилия: '.$_POST['surename'].'</p>';
}
if (trim(!empty($_POST['email']))){ 
   $body.= '<p>Email: '.$_POST['email'].'</p>';
}
if (trim(!empty($_POST['lesson']))){ 
   $body.= '<p>Название кружка / секции: '.$_POST['lesson'].'</p>';
}
if (trim(!empty($_POST['address']))){ 
   $body.= '<p>Адрес: '.$_POST['address'].'</p>';
}
if (trim(!empty($_POST['phone']))){ 
   $body.= '<p>Телефон: '.$_POST['phone'].'</p>';
}

$mail->Body = $body;

if (!$mail->send()) {
   $message = 'Ошибка отправки формы';
} else {
   $message = 'Заявка отправлена';
}

$response = ['message' => $message];

header('Content-Type: application/json');
echo json_encode($response);
?>

原因分析与解决办法

1. 服务器配置限制POST请求

405错误最常见的原因是服务器(Apache/Nginx)禁止了对sendmail.php的POST请求,比如:

  • Apache的.htaccess规则拦截了POST方法
  • Nginx配置中未允许POST请求
  • 虚拟主机服务商的安全策略限制

解决办法:

  • 检查Apache的.htaccess文件,移除或修改拦截POST的规则,确保没有类似RewriteRule ^.*$ - [R=405,L]的代码
  • 修改Nginx站点配置,添加allow_methods GET POST;
  • 联系主机服务商,确认是否默认限制了PHP文件的POST请求,申请开启权限

2. 请求路径错误

fetch('sendmail.php')使用相对路径时,若当前页面URL层级与PHP文件位置不匹配,会导致请求发送到错误地址,而该地址不接受POST请求。

解决办法:

  • 使用绝对路径,比如fetch('/your-project-path/sendmail.php')
  • 打开浏览器控制台的「网络」标签,查看请求的实际URL是否正确,确认该地址返回405状态码

3. 跨域请求限制(前后端不同域名)

如果前端页面和sendmail.php不在同一域名下,浏览器会触发跨域预检请求,若服务器未配置CORS,可能返回405错误。

解决办法:
在sendmail.php开头添加CORS响应头(生产环境建议指定具体域名,不要用*):

header("Access-Control-Allow-Origin: https://your-frontend-domain.com");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");

// 处理OPTIONS预检请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit(0);
}

4. PHP文件潜在错误(间接导致状态码异常)

虽然405属于请求方法问题,但PHP文件的语法错误、依赖缺失也可能导致服务器返回异常状态码。

解决办法:

  • 检查require路径是否正确,确保phpmailer/src/Exception.php和phpmailer/src/PHPMailer.php文件存在
  • 查看服务器PHP错误日志,排查是否有文件找不到、语法错误等问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:57:03