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

PHP8.2-FPM与Nginx配合时无.php扩展名文件无法解析求助

问题原因

你当前的Nginx配置里,try_files $uri $uri/ $uri.php $uri.html =404 虽然能找到对应的$uri.php文件,但因为请求的URL(比如/page)不匹配location ~ \.php$的正则规则,Nginx会直接把page.php作为静态文件返回,没有交给PHP-FPM解析,所以返回的内容类型是application/octet-stream,而非解析后的HTML。

解决方案

有两种可靠的调整方式,任选其一即可:

方式一:使用Rewrite规则重写URL

在location /块中添加文件存在检查的Rewrite规则,将不带.php的请求重写为带后缀的格式,交由原PHP处理块解析:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name example.com www.example.com;
    root /var/www/example.com/dist/;

    index index.html index.php;

    location / {
        # 若对应.php文件存在,重写URL到带后缀的路径
        if (-f $request_filename.php) {
            rewrite ^(.*)$ $1.php last;
        }
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }
    
    error_page 404 404.php;

    ssl_client_certificate /etc/ssl/cloudflare/cloudflare.crt;
    ssl_verify_client on;
    ssl_certificate /etc/ssl/cloudflare/*example.com/cert.pem;
    ssl_certificate_key /etc/ssl/cloudflare/*example.com/key.pem;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header Referrer-Policy "strict-origin-when-cross-origin";
}

方式二:使用内部重定向处理

定义一个内部location块,直接将不带后缀的请求转发给PHP-FPM,无需修改URL:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name example.com www.example.com;
    root /var/www/example.com/dist/;

    index index.html index.php;

    location / {
        try_files $uri $uri/ @php_handler;
    }

    # 内部PHP处理块
    location @php_handler {
        # 检查对应.php文件是否存在,不存在返回404
        if (!-f $document_root$uri.php) {
            return 404;
        }
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$uri.php;
        fastcgi_param SCRIPT_NAME $uri.php;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }
    
    error_page 404 404.php;

    ssl_client_certificate /etc/ssl/cloudflare/cloudflare.crt;
    ssl_verify_client on;
    ssl_certificate /etc/ssl/cloudflare/*example.com/cert.pem;
    ssl_certificate_key /etc/ssl/cloudflare/*example.com/key.pem;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header Referrer-Policy "strict-origin-when-cross-origin";
}
后续操作

修改配置后,执行以下命令重启Nginx使配置生效:

sudo systemctl restart nginx

同时确保目标.php文件存在于/var/www/example.com/dist/目录下,且文件权限允许PHP-FPM读取(通常设置为644,所属组为www-data)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:47:47