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

Caddy占位符使用报错:多站点(x.localhost类)配置404问题求助

解决Caddy多localhost子域名配置的"Primary script unknown"错误

嘿,我看了你遇到的问题——配置多localhost子域名(比如x.localhost、y.localhost)后出现了PHP脚本找不到的404错误,日志里显示"Primary script unknown"。结合你的Caddy配置和错误信息,我来帮你定位问题并修复:

问题根源

这个错误本质是PHP-FPM没能拿到正确的脚本绝对路径。你的配置里想用{hostonly}来匹配子域名对应的目录,但有两个小问题:一是root路径的写法不够严谨,二是FastCGI的参数传递没做对,导致PHP-FPM找不到你指定的index.php。

一步步修复

1. 修正Root路径的写法

你原来的root /var/www/{hostonly}/public少了一个*符号,这个符号是告诉Caddy要匹配所有请求路径,确保它能正确解析子域名对应的目录。改成:

root * /var/www/{hostonly}/public

另外要确认你的服务器上确实存在对应目录,比如x.localhost需要/var/www/x/public,y.localhost需要/var/www/y/public,而且这些目录的权限要让Caddy和PHP-FPM能访问(建议设置目录权限755,文件644)。

2. 简化并修正FastCGI配置

你原来手动配置fastcgi的方式容易出错,Caddy有个封装好的php_fastcgi指令,会自动处理PHP-FPM需要的所有参数(比如SCRIPT_FILENAME,这正是你缺失的关键参数)。把原来的这一段:

fastcgi / php-fpm:9000 php { index index.php }

替换成:

php_fastcgi php-fpm:9000

3. 调整Rewrite规则

你的rewrite规则写法可以更简洁,改成:

rewrite * {path} {path}/ /index.php?{query}

这样能确保所有请求(不管是直接访问路径还是目录)都能正确路由到index.php,适合大多数PHP框架或单页应用的需求。

最终完整配置

把这些改动整合后,完整的Caddy配置应该是这样的:

*.localhost:80 {
    root * /var/www/{hostonly}/public
    php_fastcgi php-fpm:9000
    rewrite * {path} {path}/ /index.php?{query}
    gzip
    browse
    log stdout
    errors stdout
}

验证修复

重启Caddy服务后,访问x.localhost/index.php或者y.localhost,如果配置正确的话,应该能正常加载PHP内容,错误日志里也不会再出现"Primary script unknown"的提示了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:07