Apache 应仅原样提供构建工具生成的带哈希文件名的静态资源,核心是设对DocumentRoot、禁用MultiViews、确保读权限与SELinux上下文正确,而非用mod_rewrite做映射。
不靠 Apache 做版本映射,而是让构建工具生成带内容哈希的文件名(如
),再由 HTML 直接引用——Apache 只需原样提供这些文件,不干预、不重写、不猜测。这才是真正自动化、零维护、兼容现代前端工程的方案。
为什么不该用 mod_rewrite 做哈希路由
试图用 Apache 的重写规则把
映射到
看似省事,实际带来三类硬伤:
每次构建后必须手动更新
,极易遗漏或出错
无法覆盖多级路径(如
)和动态嵌套结构
与 Webpack/Vite 等工具生成的完整哈希文件名(含 chunk hash、content hash)不匹配,规则很快失效
Apache 正确角色:安静地服务真实文件
Apache 的唯一职责是:当浏览器请求
时,检查磁盘上是否存在该路径的文件,并返回它。要做到这点,只需确保:
Apache 2.4.62
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
下载
指向构建输出目录(如
)
关闭
(在虚拟主机或目录配置中加
),避免 Apache 尝试匹配
等变体而失败
启用
和
,使
/
压缩文件能被自动识别并正确响应
确认 Apache 进程用户(如
)对静态文件有读取权限,否则会返回 403 而非 404
HTML 中的资源路径必须由构建工具注入
Apache 不生成、不替换、不猜测 HTML 里的
。这一步必须交由前端构建流程完成:
Webpack 用户:使用
,它会自动将打包后的哈希文件名写入
Vite 用户:默认开启
,生成的 HTML 已含正确哈希路径
若手写 HTML 或用服务端模板:读取构建产出的
(如
输出),在渲染时动态插入 URL
避免任何形式的硬编码,例如
—— 这会让缓存失效问题重现
遇到 404 但文件明明存在?按顺序排查
浏览器请求
返回 404,而该文件已部署在磁盘上,常见原因有:
Apache 配置的
指向了错误目录(比如指向源码目录而非
)
路径大小写不一致(Linux 文件系统区分大小写,
≠
)
SELinux 启用且未放行 httpd 访问该路径(RHEL/CentOS 上执行
)
文件权限不足(如属主为 root,但 Apache 运行用户是
,且无 group/o 读权限)
启用了
或其他安全模块拦截了含哈希字符串的请求(少见但需验证)
main.7a2f9e.js/js/app.js/js/app.a1b2c3.jsRewriteRule/assets/css/theme/dark.b8c4d1.css/static/js/main.e4f5d2.jsDocumentRoot/var/www/html/distMultiViewsOptions -MultiViewsmain.js.gzmod_mimemod_deflate.gz.brwww-dataHtmlWebpackPluginindex.htmlbuild.rollupOptions.output.entryFileNamesmanifest.jsonwebpack-manifest-plugin/static/css/base.f3c9a1.cssDocumentRootdist/Static//static/setsebool -P httpd_read_user_content=onwww-datamod_security