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

树莓派1B上Nginx服务器下载index.php而非执行的问题求助

解决Nginx下载PHP文件而非执行的问题

我在树莓派1B上搭建支持PHP的Nginx服务器,用来部署selfoss RSS阅读器。但访问网站时,index.php会被浏览器直接下载,而不是在服务器端执行。已经重启Nginx、清除浏览器缓存,问题依然存在。

环境信息

PHP版本

$ php -v
PHP 7.4.30 (cli) (built: Jul  7 2022 15:51:43) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies

Nginx配置

server {
    server_name rss.getty.nz;
    root /var/www/rss.getty;
    access_log /var/www/rss.getty/rss.accesss.log;
    error_log /var/www/rss.getty/rss.error.log;

    index index.php;

    location / {
        try_files $uri  /public/$uri /index.php$is_args$args =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf ;
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock ;
    }

    location ~* \ (gif|jpg|png) {
        expires 30d;
    }
    location ~ ^/(favicons|thumbnails)/.*$ {
        try_files $uri /data/$uri;
    }
    location ~* ^/(data\/logs|data\/sqlite|config\.ini|\.ht) {
        deny all;
    }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/rss.getty.nz/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/rss.getty.nz/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    access_log /var/www/rss.getty/rss.accesss.log;
    error_log /var/www/rss.getty/rss.error.log;
}
server {
    if ($host = rss.getty.nz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;
    server_name rss.getty.nz;
    return 404; # managed by Certbot
}

fastcgi-php.conf内容

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

排查与解决步骤

1. 确认PHP-FPM服务状态

先检查php7.4-fpm是否正常运行:

sudo systemctl status php7.4-fpm

如果未运行,启动并设置开机自启:

sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm

2. 检查Socket文件权限

确保Nginx有权访问PHP-FPM的Socket文件:

ls -l /run/php/php7.4-fpm.sock

正常情况下,文件所属组应为www-data(Nginx默认运行用户)。如果不符,编辑/etc/php/7.4/fpm/pool.d/www.conf,确保以下配置正确:

user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data

修改后重启php-fpm:

sudo systemctl restart php7.4-fpm

3. 修正Nginx正则错误

配置中存在明显的正则语法错误,会干扰location匹配:

# 错误写法
location ~* \ (gif|jpg|png) {
# 修正为
location ~* \.(gif|jpg|png)$ {

4. 调整PHP请求匹配逻辑

确保PHP请求能被正确捕获,可将location ~ \.php$块移至所有location规则最前端,避免被其他规则拦截。同时调整根路径的try_files规则:

location / {
    try_files $uri $uri/ /public/$uri /index.php$is_args$args;
}

5. 验证配置并重启Nginx

修改配置后先验证合法性:

sudo nginx -t

无错误则重启Nginx:

sudo systemctl restart nginx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:54:25