将Apache .htaccess静态资源版本化重写规则转换为Nginx规则
静态资源版本化URL重写:Apache转Nginx正确方案
问题分析
原项目采用URL静态资源版本化,前端请求带时间戳版本号的资源(如assets/js/jquery.min.1661243858.js),服务器实际文件路径为assets/js/jquery.min.js。原Apache规则通过重写去掉版本号,当前Nginx规则未完全匹配原逻辑导致在ddev环境失效。
原Apache规则逻辑拆解
- 仅当请求的文件不存在时触发重写
- 匹配路径格式:
[路径部分]/[文件名主体].[版本号].[后缀] - 重写目标:去掉中间的版本号,拼接为
[路径部分]/[文件名主体].[后缀]
修正后的Nginx规则
location ~* ^(.*\/)?([a-zA-Z0-9\.\-]+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ { try_files $uri $1$2.$4; }
规则说明
- 正则匹配优化:
^(.*\/)?:捕获资源所在的路径部分(可选,适配根目录下的资源)([a-zA-Z0-9\.\-]+):捕获文件名主体(支持字母、数字、点、横杠,覆盖原规则的字符范围)\.(\d+)\.:匹配中间的数字版本号部分- 后缀列表完全对齐原Apache规则,包含所有需要处理的资源类型
- try_files逻辑:
- 先尝试访问请求的带版本号的文件(
$uri) - 若文件不存在,自动转向去掉版本号的实际文件路径(
$1$2.$4),与原Apache规则的RewriteCond %{REQUEST_FILENAME} !-f逻辑一致
- 先尝试访问请求的带版本号的文件(
当前规则失效原因
- 后缀列表不全:未覆盖原规则中的
bmp|cur|ico|svgz?|webmanifest等类型 - 正则分组不够精准:原规则允许路径部分为空(根目录资源),当前规则的
(.+)可能匹配异常 - 若ddev环境中该规则放置位置靠后,可能被其他更优先的location规则覆盖,需确保该规则放在通用静态资源location之前
内容的提问来源于stack exchange,提问作者bartpulse
相关产品推荐
相关产品推荐

