servername本身不写入日志,但决定虚拟主机路由和日志归属;必须为每个块唯一配置合法域名(如example.com),配合logformat "%{host}i"才能在access.log中准确记录访问域名。

ServerName 本身不直接写入访问日志,但它会影响日志中 Host 头解析结果 和 虚拟主机路由准确性,进而决定哪条日志记录对应哪个站点。正确配置 ServerName + 日志格式,才能让 access.log 真实反映“谁在访问哪个域名”。
ServerName 必须明确且唯一
每个 <virtualhost></virtualhost> 块里只能有一个 ServerName,且必须是完整、合法的域名(不含协议、端口、引号或空格):
- ✅ 正确:
ServerName example.com或ServerName api.example.com - ❌ 错误:
ServerName "example.com"、ServerName example.com www.example.com、ServerName localhost:8080(仅限开发多端口场景)
如果 ServerName 缺失或非法,Apache 启动会报错或降级到默认虚拟主机,导致日志记录错乱——本该记到 admin.example.com 的请求,可能被记进 default 日志里。
用 %{Host}i 记录实际请求域名
默认日志格式(Common Log Format)不包含 Host 头,只记录 IP 和路径。要确认用户到底访问了哪个域名,需自定义 LogFormat:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 在
httpd.conf或httpd-vhosts.conf中添加:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Host}i\"" combined_with_host
- 然后在
CustomLog中启用:
CustomLog logs/access_log combined_with_host
这样每行日志末尾就会多出一列,比如 "example.com" 或 "www.example.com",清晰区分不同域名的访问流量。
多站点共用 IP 时,ServerName 决定日志归属
当多个域名绑定在同一 IP+端口(如 443),Apache 靠 ServerName + ServerAlias 匹配 Host 头来分发请求。若配置冲突:
- 两个
<virtualhost></virtualhost>都写ServerName example.com→ Apache 只认第一个,其余请求全记进第一个站点日志 - 遗漏 ServerName,仅靠 ServerAlias → 请求无法精准匹配,可能 fallback 到默认站点,日志混杂
务必保证每个 HTTPS 虚拟主机都有独立、无歧义的 ServerName,并搭配对应的 SSL 证书和日志路径:
<virtualhost><br> ServerName shop.example.com<br> CustomLog logs/shop_access.log combined_with_host<br> # ... SSL 配置<br></virtualhost>
避免 HostNameLookups 带来的性能损耗
不要开启 HostNameLookups on 来把 IP 替换成域名写入日志。它会强制每次请求做 DNS 查询,大幅拖慢日志写入速度,还可能因 DNS 故障丢日志。
- ✅ 推荐:
HostNameLookups off(默认值,保持即可) - ✅ 替代方案:用
%{Host}i获取浏览器发送的真实 Host 头,准确又高效










