Caddy占位符使用报错:多站点(x.localhost类)配置404问题求助
嘿,我看了你遇到的问题——配置多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

