Nginx 把 PHP 文件当下载而不是执行,怎么办?

Nginx 下载 .php 而非执行的根因与修复:缺少 PHP-FPM 的 fastcgi 配置块;完整 location ~ \.php$ 示例、socket 路径确认、安全提醒(源码泄露风险)与 FAQ。

最佳实践
Nginx 把 PHP 文件当下载而不是执行,怎么办?封面

根因:Nginx 本身不会执行 PHP——它需要把 .php 请求转发给 PHP-FPM(FastCGI)。你的配置缺少或未命中正确的转发块,于是 PHP 文件被当普通静态文件直接返回,浏览器就弹下载了。 应检查响应内容是否包含 PHP 源码;如果确认源代码被返回,就是源码泄露,需要立即处理。

修复:补上 PHP-FPM 转发配置

在 server 块中加入:

location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;                       # 或 fastcgi.conf
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;   # 与 PHP-FPM 实际 socket 一致
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
}

同时在 server 块里确保 index 包含 PHP:

index index.php index.html;

改完 nginx -t && systemctl reload nginx。

逐项确认清单

  1. PHP-FPM 装了且在跑:

    sudo apt install php-fpm          # Ubuntu/Debian
    systemctl status php8.2-fpm       # 确认 active
    
  2. socket 路径对得上:grep '^listen' /etc/php/*/fpm/pool.d/www.conf 的输出必须和 fastcgi_pass 写的一致。PHP 升级后路径里的版本号常变(php7.4-fpm.sock → php8.2-fpm.sock),是最高频翻车点。

  3. location 顺序没被抢:确认没有更优先的正则 location 把 .php 请求截走。

为什么这是安全事故

当确认 Nginx 返回的是 PHP 源码而非应用有意生成的附件时,用户拿到的是源代码——数据库密码、API 密钥、内部逻辑全部裸奔。发现此问题的第一反应应该是:立即修复 + 轮换该代码库里的所有凭据,而不只是"让它能跑"。

顺手加固:只放行入口文件

更严的写法,只允许执行明确的入口文件,杜绝上传目录里的 PHP 被执行。以下配置替换通用 PHP 处理块,其他入口须逐个列出;还需核对 root/alias 和其他 location 是否绕过限制:

location = /index.php {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}

# 其余 PHP 请求不允许执行或作为静态源码返回
location ~* \.php(?:/|$) { return 404; }

常见问题(FAQ)

Q:加了配置变成 502 Bad Gateway?
A:请求可能已进入 FastCGI 处理,但仍需排查连接问题——socket 路径不对或权限不足(www-data 读不到 fpm.sock)。按"Nginx 连接 PHP-FPM socket 报 Permission denied"那篇的清单查。

Q:用了 Apache 也需要这个吗?
A:Apache 也需要正确的 PHP 处理器,可以使用 mod_php,也可以通过 proxy_fcgi 连接 PHP-FPM;缺少处理器同样可能返回源码。

Q:能用 TCP 端口代替 socket 吗?
A:可以:PHP-FPM 配 listen = 127.0.0.1:9000,Nginx 写 fastcgi_pass 127.0.0.1:9000;。不同容器通常通过内部网络走 TCP,也可通过共享卷使用 Unix socket,前提是路径和权限正确。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台