.htaccess跨文件夹层级的链接重写

目的是在支持webp的浏览器返回webp图片,同时保障不支持的webp的ie之类的浏览器返回jpg。

选择了.htaccess重写链接

即例如访问
localhost/img/video/BV1ba4y1a76o.jpg
在支持webp的浏览器重写为
localhost/img/video/BV1ba4y1a76o.webp
不支持或没有对应的webp文件则维持原样
localhost/img/video/BV1ba4y1a76o.jpg

实现方法是

RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_URI} (?i)(.*).jpg$
RewriteCond %{DOCUMENT_ROOT}%1.webp -f
RewriteRule (?i)(.*).jpg$ %1.webp [L,T=image/webp,R]
AddType image/webp .webp


以下是产生问题的点

为方便文件管理需要对文件结构修改,webp文件并不与jpg文件放在一个文件夹,文件夹的结构与功能如下

那么按照要求链接
localhost/img/video/BV1ba4y1a76o.jpg
需要重写为
localhost/img/video/webp/BV1ba4y1a76o.webp

那么在这时.htaccess如何修改?我理解了下这里的写法

RewriteCond %{HTTP_ACCEPT} image/webp
从请求头中判断浏览器是是否支持webp

RewriteCond %{REQUEST_URI} (?i)(.*).jpg$
请求的链接是jpg文件

RewriteCond %{DOCUMENT_ROOT}%1.webp -f
读取同一目录下是否有同名的webp文件

RewriteRule (?i)(.*).jpg$ %1.webp [L,T=image/webp,R]
符合所有的RewriteCond限定那么重写链接

大量使用到的%1表示指向文件本身

我尝试了做了以下的修改
RewriteRule (?i)(.*).jpg$ %1.webp [L,T=image/webp,R]
修改为
RewriteRule (?i)(.*).jpg$ %1 [L,T=image/webp,R]

那么重写
localhost/img/video/BV1ba4y1a76o.jpg
的结果为
localhost/img/video/webp/BV1ba4y1a76o

那么使用%1将很难将BV1ba4y1a76o.jpg重写为webp/BV1ba4y1a76o.webp
而且RewriteCond %{DOCUMENT_ROOT}%1.webp –f这条限定也要去查询webp文件夹中是否有相关文件。

那么有什么办法可以解决问题?

如果这个%1可以当成变量进行字符串操作那么我想会简单很多,但我并没有找到.htaccess在这方面的用法。
如果网络上有这方面的讲解或者这个问题的其他解法,请麻烦告诉我也可以节省时间重复回答。辛苦了!

阅读 1.5k
1 个回答

先前的答案有些问题,重新查了一下资料, % 开头的反向引用是引用的 RewriteCond 的捕获组 、$ 开头的反向引用才是 RewriteRule ,所以调整了一下,试了一下 OK。

RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_URI} (?i)(.+)/(.+)\.jpg$
RewriteCond %{DOCUMENT_ROOT}%1/webp/%2.webp -f
RewriteRule (?i)(.+)\.jpg$ %1/webp/%2.webp [L,T=image/webp,R]
AddType image/webp .webp
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题