如何在Apache2的.htaccess中覆写请求,实现缓存参数的文件跳转?
Apache .htaccess 重写规则配置方案
没问题,这就给你搞定这个重写规则的配置,完美匹配你的需求!
前提准备
首先得确保你的Apache服务器已经启用了mod_rewrite模块,并且在网站的主配置文件(比如httpd.conf或者虚拟主机配置)里,给static目录设置了AllowOverride All,这样.htaccess文件的规则才能生效:
<Directory "/path/to/example.com/static"> AllowOverride All </Directory>
编写.htaccess规则
把下面的代码放到example.com/static/.htaccess文件里(正好对应你的目录结构):
RewriteEngine On # 仅当查询字符串为type=cache,且对应带_cache后缀的文件存在时,执行重写 RewriteCond %{QUERY_STRING} ^type=cache$ RewriteCond %{REQUEST_FILENAME} ^(.*)\.([a-zA-Z0-9]+)$ RewriteCond %1_cache.%2 -f RewriteRule ^(.*)$ %1_cache.%2 [L]
规则拆解说明
我来解释下每一行的作用,让你清楚为什么这么配置:
RewriteEngine On:开启Apache的URL重写引擎,这是所有重写规则的基础前提。RewriteCond %{QUERY_STRING} ^type=cache$:精确匹配查询字符串**正好是type=cache**的请求,避免其他带type参数的请求被误处理(比如type=other不会触发规则)。RewriteCond %{REQUEST_FILENAME} ^(.*)\.([a-zA-Z0-9]+)$:把请求的文件名拆成两部分:%1是不带后缀的文件名(比如file.png里的file),%2是文件后缀(比如png)。RewriteCond %1_cache.%2 -f:检查服务器上是否存在[文件名]_cache.[后缀]这个文件(比如file_cache.png),只有存在才会执行后续重写,避免返回404错误。RewriteRule ^(.*)$ %1_cache.%2 [L]:执行重写,将原请求的文件路径替换成带_cache后缀的版本,[L]表示这是最后一条规则,处理完就停止,不再执行其他规则。
效果验证
按照这个配置,你的请求会得到如下处理:
- 访问
http://example.com/static/images/file.png:Apache默认返回file.png,符合基础需求。 - 访问
http://example.com/static/images/file.png?type=cache:因为file_cache.png存在,服务器会返回这个文件。 - 访问
http://example.com/static/photos/file.jpg?type=cache:同理返回file_cache.jpg。 - 如果请求的带
_cache后缀的文件不存在(比如test.png?type=cache但test_cache.png不存在),则不会触发重写,服务器会返回原文件(如果原文件存在)或者404(如果原文件也不存在)。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

