可行,但需分步验证:先在httpd.conf中添加Listen端口、启用mod_expires模块和httpd-vhosts.conf,再在各<VirtualHost *:端口>块内单独配置Expires规则,最后用httpd -t校验并检查响应头确认生效。

XAMPP 同时配置多端口和 Expires 缓存头是可行的,但必须分步验证、顺序加载模块、且不能共用同一组缓存规则覆盖所有端口 —— 否则容易出现 403、500 或缓存不生效的情况。
修改 httpd.conf 开启监听端口和必要模块
Apache 默认只监听 80,要支持 :8080、:8081 等端口,得先在主配置中显式声明;同时 mod_expires 必须启用,否则后续所有缓存配置都无效。
- 打开
C:\XAMPP\apache\conf\httpd.conf,找到Listen 80行,在其下方添加需要的端口(每行一个):Listen 8080 Listen 8081
- 确认这行未被注释:
LoadModule expires_module modules/mod_expires.so - 顺手检查
Include conf/extra/httpd-vhosts.conf是否已取消注释(即前面没有#),这是多站点生效的前提 -
ServerName建议保持为localhost:80,不要改成其他端口,否则 Apache 可能启动失败
在 httpd-vhosts.conf 中按端口定义虚拟主机并启用缓存
每个 <VirtualHost *:端口号> 块是独立作用域,Expires 规则必须写在对应块内,或放在 <Directory> 段里,不能只写在全局配置末尾——那样只对默认端口生效。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 在
C:\XAMPP\apache\conf\extra\httpd-vhosts.conf底部添加类似如下结构(注意路径无尾斜杠、权限放开):<VirtualHost *:8080> ServerName localhost:8080 DocumentRoot "C:/xampp/htdocs/project-a" <Directory "C:/xampp/htdocs/project-a"> Options Indexes FollowSymLinks AllowOverride All Require all granted ExpiresActive On ExpiresByType text/css "access plus 1 week" ExpiresByType application/javascript "access plus 1 week" ExpiresByType image/jpeg "access plus 1 month" </Directory> </VirtualHost> - 多个端口需重复该结构,但每个
DocumentRoot路径必须真实存在且可读 - 若项目含 PHP,确保
AllowOverride All已设,否则.htaccess中的重写或缓存指令可能被忽略
验证配置语法并重启 Apache
改完配置别急着点 XAMPP 控制面板重启,先用命令行做语法校验,避免因拼写错误或缩进问题导致 Apache 启动失败。
- 打开命令提示符(管理员权限非必需,但可避免权限报错),执行:
C:\XAMPP\apache\bin\httpd.exe -t
返回Syntax OK才代表配置无硬错误 - 如果提示
Invalid command 'ExpiresActive',说明mod_expires没加载成功,回查httpd.conf中LoadModule行是否漏掉或路径写错 - 若访问时出现 403,重点检查
<Directory>块里的Require all granted是否写对(旧版 Apache 用Order Allow,Deny+Allow from all,XAMPP 7.4+ 默认用新语法) - 浏览器中按
F12 → Network切换到某个 CSS 文件,查看响应头是否有Expires和Cache-Control字段,没有则说明规则未命中或被更高优先级配置覆盖
缓存头不生效的三个典型盲区
即使配置全对,Expires 也可能“看起来没用”——原因往往不在代码本身,而在环境细节。
- PHP 脚本输出的内容(比如动态生成的 CSS)默认不走静态缓存逻辑,
Expires规则只对真实文件有效;如需缓存 PHP 输出,得额外加Header set Cache-Control或在脚本里用header() - Chrome 开发者工具默认勾选 “Disable cache”(在 Network 面板右上角),关掉它再刷新,否则永远看不到缓存效果
- Windows hosts 文件若把
localhost映射到了其他 IP(比如127.0.0.2),而ServerName还写localhost:8080,会导致虚拟主机匹配失败,请求落到默认站点,缓存规则自然不触发

















