这是一个真是让人头疼的问题!任何一位天才解决了这个谜题,都将获得 PayPal 捐款,可以吃一顿双人晚餐。现在让我们开始吧。假设:大多数代理不会缓存 URL 中带有“?”的资源,即使响应中存在 Cache-control:公共标头。要为这些资源启用代理缓存,我必须从对静态资源的引用中删除查询字符串,而是将参数编码到文件名本身中。*
以前曾
<img src="/imgcpu?src=folder1/photo_citty.jpg&w=3500&h=10&c=p&q=90" />
<img src="/imgcpu?src=folder2/photo_doggy.jpg&w=100&h=200&c=p" />
<img src="/imgcpu?src=folder3/photo_birds.jpg&w=200&h=500&f=bw" />
<img src="/imgcpu?src=folder3/photo_frogs.jpg&h=200" />
工作中
<img src"/IMG-folder/photo_w100_h100_cf_q60.jpg"/>
- 图像将驻留在根目录深处的 1 个文件夹中(永远不会更深)
- img.php?src= 或 img?src= 将永远以此命名
- ....jpg &w、&h、&q、&m、&f 和 &c 之后是唯一需要变量的字母(例如:&w=200&h&=50&c=p&f=bw&q=90),但所有字母都应该是可选的
以这个不优雅的代码为代价
# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&q=$5 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_f(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&f=$5&q=$6 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_f(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&f=$5 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&q=$5 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_f(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&f=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3 [L]
RewriteRule ^IMG-(.+)_w(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2 [L]
RewriteRule ^IMG-(.+)_h(.+).jpg$ imgcpu\?src=$1\.jpg&h=$3 [L]
但是,仍有无数其他可能性未被发现:例如,不包括首先为高度指定宽度的情况等。不,这行不通!我如何重定向 OPTIONALLY ALL 参数?&w= 或 &h= 类似于 &[az]=(.*),以便 _h 或 _w 或 _m 都是通用且可选的,并且当给定时由重写的、代理友好的 URL 进行干预?
所以现在的任务是:[photo123.jpg]&[a-z]=(.*)&[a-z]=(.*)etcettera
将后面的 部分或所有查询重写为photo123_X-x_Y-y(optionally more queries).jpg
答案1
我建议逐步替换字段。 大致如下:
(未经测试)
# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
RewriteRule ^IMG-(.+)_w([^_]+)(_.*)$ imgcpu\?src=$1\.jpg&w=$2$3 [C]
RewriteRule ^(imgcpu[^_]*)_h([^_]+)(_.*)$ $1&h=$2$3 [C]
RewriteRule ^(imgcpu[^_]*)_q([^_]+)(_.*)$ $1&q=$2$3
依此类推,直到您逐个转换所有字段,而不是尝试一次性完成所有转换。每条规则将依次应用。这应该适用于任何顺序的字段,并允许它们是可选的。
忽略[C]
这一系列规则的最后一部分。
编辑:
这比我迄今为止发布的任何废话都更有可能起作用:
# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
RewriteRule ^IMG-(.+\/photo_[^_]+)(_.*)*(\.[^.]+)$ imgcpu\?src=$1$3$2/ [C]
RewriteRule ^(imgcpu.*\..+)_w([^_]+)(_.*)*$ $1&w=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_h([^_]+)(_.*)*$ $1&h=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_q([^_]+)(_.*)*$ $1&q=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_c([^_]+)(_.*)*$ $1&c=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_m([^_]+)(_.*)*$ $1&m=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_f([^_]+)(_.*)*$ $1&f=$2$3 [C]
主要的改进尝试涉及第一个美元符号前的星号,目的是使被重写的字段是查询字符串中的最后一个字段时,将第一个更改为[^_]*
。.*
请注意,我把最大的失误留到最后才提到——希望它不会被注意到?等等……什么?注意到它试图不被注意了吗?说到没有注意到……我刚刚才注意到文件名包括下划线!
编辑:现在是这个时间了——现在是这个时间了!
编辑:
尝试用这一行代替第一行RewriteRule
(其他所有行保持不变)。
RewriteRule ^IMG-(.+\/.*?)(_[hw]\d+)([^.]*)(\.[^.]+)$/imgcpu\?src=$1$4$2$3/ [C]
这取决于高度或宽度字段是否在字段中处于首位。您可以在 中添加更多字母[hw]
。但请注意,像“/IMG-folder/santa_claus_w2_elves_w200_h100_q75.jpg”(圣诞老人和两个精灵)这样的文件名不会产生正确的结果。
编辑(12月15日):
RewriteCond %{QUERY_STRING} ^(.*\.[^_]*)_(.)([^_]*)(_.*)?$
RewriteRule ^/imgcpu /imgcpu?%1&%2=%3%4 [N]
RewriteCond %{REQUEST_URI} ^/IMG.*$
RewriteRule ^/IMG-(.+/.*?)(_[hw]\d+)([^.]*)(\.[^.]+)$ /imgcpu?src=$1$4$2$3 [N]
答案2
我曾经有一个正则表达式做过类似的事情,但格式略有不同。我把它弄乱了一点,但它完全没有经过测试,也没有完成(更不用说我讨厌正则表达式了),但希望它能让你走上正轨:
RewriteRule ^(.*?\IMG-)(.*)_(\?[^_]*)?_([^_]*)_([^_]*)(.*)$ /imgcpu?src=(?2$2&:\?)$4=$5$6 [LP]
基本上,它会提取 URL 的第一部分,然后继续循环直到没有更多_
字符,然后以的格式将它们附加&$1=$2
到 URL 上。
这意味着您必须使用格式,/IMG-folder1/photo_citty_w_3500_h_10_c_p_q_90.jpg
但我确信您可以修复它,只需迈出一步即可,而不是使用下划线。
我可以建议你让你的生活非常如果 URL 的文件名部分不使用分隔符 ( _
),会不会更容易?您可以使用许多其他分隔符(例如-
),以降低重写规则的复杂性。