FrankenPHP 默认注入 Server: FrankenPHP/0.12.3 响应头,需在 frankenphp.yaml 中设 server_header: false 或启动时加 --no-server-header 参数禁用;其不走 FastCGI,故 fastcgi_hide_header 无效,X-Powered-By 需从 php.ini(expose_php = Off)和 FrankenPHP 环境配置双端控制。

FrankenPHP 自身不主动写 Server 头,但默认会透传 PHP-FPM 或底层 SAPI 的响应头(包括 X-Powered-By 和后端的 Server),同时其内置 HTTP 服务器在启动时可能暴露 Server: FrankenPHP/0.12.3 —— 这个头必须手动清除,否则扫描器一眼就能识别。
怎么关掉 FrankenPHP 自带的 Server 响应头
FrankenPHP 的 Server 头由其 Go 层 HTTP 服务器注入,不能靠 server_tokens off(那是 Nginx 的),也不能用 proxy_hide_header(你没走反代)。唯一有效方式是启动时禁用:
- 在
frankenphp.yaml配置文件的顶层加:server_header: false - 若用命令行启动(如
frankenphp serve),加参数:--no-server-header - 验证:启动后执行
curl -I http://localhost | grep Server,应无输出或只返回空值
为什么 fastcgi_hide_header X-Powered-By 不起作用
因为 FrankenPHP 不走 FastCGI 协议与 PHP 通信——它用的是嵌入式 PHP SAPI(类似 CLI 模式),所以 Nginx 风格的 fastcgi_hide_header 完全无效。你得从两个地方堵:
- PHP 层:确保
expose_php = Off在php.ini中已生效,并重启 FrankenPHP(不是 php-fpm) - FrankenPHP 层:在
frankenphp.yaml的env下添加:PHP_INI_SCAN_DIR: ""(防用户目录覆盖),并确认未在脚本里调用header('X-Powered-By: ...') - 若仍出现,检查是否用了
phpinfo()或调试中间件——它们可能硬编码输出
错误页和响应体里还藏着版本吗
是的。FrankenPHP 默认错误页(如 404、500)会显示框架名和版本号,尤其当你启用了开发模式(APP_ENV=local)时。这不是响应头问题,而是 HTML 内容泄露:
立即学习“PHP免费学习笔记(深入)”;
- 生产环境必须设
APP_ENV=production,它会关闭详细错误页 - 自定义错误页(如
public/500.html)里别写Powered by FrankenPHP v0.x这类字样 - 检查
vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/等路径下的 Blade 模板,删掉所有框架标识文本
最容易被忽略的是:FrankenPHP 启动日志本身会打印版本号(Starting FrankenPHP v0.12.3...),如果日志被前端页面直接读取或暴露在 /logs/ 路径下,等于白藏。务必限制日志访问权限,并避免在响应中回显启动信息。



















