配置ServerSignature后仍显示Apache服务器签名,无效请求跳转异常求助
核心问题定位
你的问题出在Silverstripe的路由机制优先捕获了无效请求,没有触发Apache层面的错误页跳转规则,导致Apache直接返回默认错误响应,暴露了服务器签名。即使设置了ServerSignature Off和ServerTokens Prod,如果错误响应是Silverstripe未正确处理后触发的Apache默认输出,仍可能出现签名泄露的情况。
1. 配置Silverstripe自定义错误页
Silverstripe自身有一套错误处理体系,需先让它接管所有错误请求,避免Apache直接输出默认页。在mysite/_config/config.yml中添加以下配置:
SilverStripe\Control\Director: error_page_404: 'error-404' error_page_500: 'error-500'
其中error-404和error-500是你在Silverstripe后台创建并发布的错误页面的URL别名,确保这些页面已正常发布。
2. 强制Apache覆盖错误响应
在站点的.htaccess文件(或Apache虚拟主机配置)中添加强制错误页规则,确保即使Silverstripe未处理,Apache也会返回自定义页面:
# 自定义错误页路径,使用根相对路径 ErrorDocument 404 /error-404 ErrorDocument 503 /error-503 # 确保错误页本身能被正常访问,不会被重写规则拦截 <FilesMatch "(error-404|error-503)"> Allow from all RewriteEngine Off </FilesMatch>
3. 检查Silverstripe重写规则
确认.htaccess中的Silverstripe重写规则没有错误拦截请求,标准规则如下(如果有自定义规则,需确保不会跳过错误页逻辑):
RewriteEngine On RewriteBase / # 跳过已存在的文件、目录和静态资源 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ framework/main.php?url=$1 [QSA,L]
4. 确保Server配置全局生效
ServerSignature Off和ServerTokens Prod必须在Apache全局配置文件(如httpd.conf)或对应站点的VirtualHost块中设置,.htaccess不支持ServerTokens指令。设置完成后,重启Apache服务生效。
5. 验证测试
访问以下类型的无效请求验证效果:
- 不存在的静态文件(如
/non-exist.jpg) - Silverstripe路由范围内的无效页面(如
/invalid-dynamic-page) - 触发后端不可用的请求(可临时停止Tomcat测试503场景)
查看响应页面是否为自定义错误页,同时检查响应头的Server字段,应仅显示Apache,无版本或其他敏感信息。
内容的提问来源于stack exchange,提问作者apark

