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
相关产品推荐
相关产品推荐

