
Nginx 默认 PHP 处理规则无法匹配双扩展名(如 Contao-Manager.phar.php),需调整 fastcgi_split_path_info 正则及 location 优先级,确保 .phar.php 被识别为可执行 PHP 脚本。
nginx 默认 php 处理规则无法匹配双扩展名(如 `contao-manager.phar.php`),需调整 `fastcgi_split_path_info` 正则及 location 优先级,确保 `.phar.php` 被识别为可执行 php 脚本。
在使用 DDEV(尤其是 macOS Apple Silicon 环境)部署 Contao 等依赖 PHAR 的 PHP 应用时,直接通过浏览器访问 Contao-Manager.phar.php 返回 404,通常并非路径错误,而是 Nginx 的 PHP 匹配逻辑未覆盖 .phar.php 这类复合扩展名。根本原因在于:Nginx 的 location ~ \.php$ 规则虽能匹配以 .php 结尾的 URI,但后续 fastcgi_split_path_info 的正则表达式默认仅适配单段扩展(如 script.php),而 Contao-Manager.phar.php 实际包含两个点号,原始正则 ^(.+?\.php)(/.*)$ 会错误截断路径,导致 $fastcgi_script_name 解析失败,最终 try_files $uri =404 直接返回 404。
✅ 正确解决方案是增强 PHP location 的匹配鲁棒性,并确保 .phar.php 被优先交由 PHP-FPM 处理。推荐修改 location ~ \.php$ 块如下:
location ~ \.php$ {
# 关键:支持 .phar.php、.foo.php 等多点扩展名
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# 先尝试精确匹配脚本文件(含 .phar.php),再 fallback 到 404
try_files $fastcgi_script_name =404;
fastcgi_pass unix:/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
fastcgi_intercept_errors off;
fastcgi_read_timeout 10m;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
⚠️ 注意事项:
- fastcgi_split_path_info 的正则 ^(.+\.php)(/.+)$ 中 .+\.php 使用贪婪匹配,能正确捕获 Contao-Manager.phar.php 整体作为脚本名($1),而 /.* 部分(如 ?/install)进入 $2 作为 PATH_INFO;
- 必须移除原配置中 location / 内的 try_files $uri $uri/ /index.php?$query_string 对 .php 文件的兜底处理,否则请求会先被 location / 拦截并重写为 /index.php,绕过 PHP location,导致 .phar.php 永远无法抵达 PHP-FPM;
- 若仍 404,请立即检查 Nginx 日志:tail -f /var/log/nginx/access.log 和 /var/log/nginx/error.log,确认是否出现 *no such file or directory 或 FastCGI sent in stderr: "Primary script unknown" —— 这表明 $fastcgi_script_name 解析为空或路径错误;
- 补充安全建议:.phar.php 文件应置于 Web 可访问目录内,但建议通过 location ~ \.phar\.php$ { allow all; } 显式放行,并避免将其与敏感配置文件共存。
总结:解决 .phar.php 404 的核心是让 Nginx 正确识别其为 PHP 脚本而非静态资源。这依赖于精准的正则匹配与 location 优先级控制。修改后 reload Nginx(ddev restart)即可生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











