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

配置Nginx允许AJAX调用PHP脚本及解决405错误问题

嘿,我来帮你搞定这个问题!先说说你碰到的405错误——这大概率是服务器拒绝了你的请求方法(比如POST),或者PHP脚本的处理配置没弄对。咱们先把「静态托管」的概念掰明白,再一步步配置Nginx解决问题。

先搞懂「静态托管」是什么

简单说,静态托管就是服务器只负责把HTML、JS、CSS、图片这些静态文件原封不动地发给浏览器,不会去执行任何动态脚本(比如PHP)。如果你的服务器当前只开了静态托管模式,那浏览器请求PHP脚本时,服务器只会把PHP的源码直接返回,根本不会解析执行,自然会出各种错误,包括你遇到的405。

解决405错误&配置Nginx支持AJAX调用PHP

下面是具体的配置和排查步骤,跟着来就行:

1. 确保Nginx能正确解析PHP脚本

Nginx本身不会处理PHP,得配合PHP-FPM(PHP的FastCGI进程管理器)来干活。你需要修改Nginx的配置文件(通常在/etc/nginx/sites-available/目录下,或者/etc/nginx/nginx.conf),添加PHP解析的规则:

server {
    listen 80;
    server_name your-domain.com; # 换成你的域名或服务器IP
    root /path/to/your/web/files; # 这里填你的HTML、JS、PHP所在的文件夹路径

    # 处理静态文件(HTML、JS、CSS这些)
    location / {
        try_files $uri $uri/ =404;
    }

    # 关键:处理PHP脚本的配置
    location ~ \.php$ {
        include snippets/fastcgi-php.conf; # 这是Nginx默认的PHP配置片段,大部分系统都自带
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 换成你实际的PHP-FPM版本,比如php7.4-fpm.sock
        # 允许POST请求(AJAX常用POST)
        fastcgi_method POST;
        # 确保请求头正确传递,比如JSON格式的Content-Type
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
    }

    # 允许AJAX预请求的OPTIONS方法(避免跨域或复杂请求被拦截)
    if ($request_method = OPTIONS) {
        return 200;
    }
}

配置完后,重启Nginx和PHP-FPM生效:

sudo systemctl restart nginx
sudo systemctl restart php8.2-fpm # 换成你的PHP-FPM版本

2. 检查PHP脚本的请求处理逻辑

你的AJAX是把JSON字符串通过POST发过去的,这时候PHP不能用$_POST来拿数据($_POST只认form表单格式的请求),得用php://input读取原始请求体:

举个例子,你的save.php应该这么写:

<?php
// 读取AJAX发来的JSON数据
$rawJson = file_get_contents('php://input');
$requestData = json_decode($rawJson, true);

// 验证数据是否有效
if (!$requestData) {
    echo json_encode(['status' => 'error', 'msg' => '无效的JSON数据']);
    exit;
}

// 保存到JSON文件
$savePath = 'data.json';
if (file_put_contents($savePath, json_encode($requestData, JSON_PRETTY_PRINT))) {
    echo json_encode(['status' => 'success', 'msg' => '数据保存成功']);
} else {
    echo json_encode(['status' => 'error', 'msg' => '文件写入失败,请检查权限']);
}
?>

3. 排查文件权限问题

确保PHP脚本和要保存的JSON文件所在目录,有服务器运行用户(通常是www-data)的读写权限:

sudo chown -R www-data:www-data /path/to/your/web/files
sudo chmod -R 755 /path/to/your/web/files

4. 测试AJAX请求

你的JavaScript代码要确保请求头正确设置为Content-Type: application/json,比如:

const myData = { username: 'test', content: 'hello' };
fetch('save.php', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(myData),
})
.then(res => res.json())
.then(result => console.log(result))
.catch(err => console.error('请求出错:', err));
最后再排查一遍
  • 确认PHP-FPM服务正在运行(用systemctl status phpX.X-fpm检查)
  • 重启Nginx后,访问PHP脚本的URL,看是否能正常解析(比如直接在浏览器打开http://your-domain/save.php,应该返回错误提示而不是源码)
  • 如果还是405,检查Nginx的错误日志(/var/log/nginx/error.log),里面会有具体的拒绝原因

内容的提问来源于stack exchange,提问作者Steven Kaufman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:10:59