这是屁股问题的痛苦! 鉴于:大多数代理,不要caching资源与“?” 即使在响应中存在Cache-control:public头部,它们的URL也是如此。 为了启用这些资源的代理caching,我已经从引用到静态资源中删除查询string,在非常丑陋的Apache正则expression式代码!*
第一部分完成与Dennis Williamson & Mark Henderson马克亨德森两个天才的线索
第二部分在这里,这个问题涵盖了第二部分:使代码优雅和不太干净
以前有过
<img src="/imgcpu?src=folder1/some_funny_kitty.jpg&w=3500&h=10&c=p&q=90" /> <img src="/imgcpu?src=folder3/camels_ride_on_birds.jpg&w=200&h=500&f=bw&q=10" /> <img src="/imgcpu?src=folder3/clay_loves_frogs.jpg&h=200" />
工作中
<img src="/IMG-folder1/some_funny_kitty_w3500_h10_cp_q90.jpg" /> <img src="/IMG-folder3/camels_ride_on_birds_w200_h500_fbw_q10.jpg" /> <img src="/IMG-folder3/clay_loves_frogs_h200.jpg" />
在这个不雅的代码的成本
# Rewrite imgcpu?src= thumbnail maker to nice static urls RewriteCond %{REQUEST_URI} ^IMG.*$ 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(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&q=$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] + many many other combinations etcettera!
注意:1)imgcpu.php?src =可以根据需要进行修改。 2)图像将永远在一个文件夹深,从不深3)所有的文件将以.jpg结束后至分界符启动IMG-folder1/some_file_w100_h200.jpg (漂亮的静态.jpg url)
imgcpu?src=folder1/some_file.jpg&w=100&h=200 (丑陋的文件url)
由于imgcpu [.php]可以改变,这是我的答案,即使它会解开你做的很多工作
在一个程序中,你可以遍历所有可能的属性,并提取出现的属性(以任何顺序!)。 您可以使用单个规则replace所有这些规则:
RewriteRule ^IMG-(.*)$ imgcpu\?parse=$1 [L]
然后在imgcpu脚本中,将“parsing”为包含folder1/some_funny_kitty_w3500_h10_cp_q90.jpg的variables。 从头开始删除扩展名,文件夹和文件名,然后可以遍历各个参数并从string中提取它们。 就像(PHP),但是这个概念可以用任何语言来完成,你甚至可以在没有正则expression式的情况下保存几个ms:
$values["q"]=50; // Set some defaults? foreach (array("h","w","q","c","f") as $param) { if (preg_match("/_${param}([^_]+)/",$_REQUEST["parse"],$result)) { $values[$param]=$result[1]; } }
最后$values["h"]会有高度。 如果你想添加新的参数,这将是一个更容易维护吨。 你需要做一些工作来弄清楚你应该怎么处理“my_w2000_desktop_w200_h100.jpg”(或者更糟糕的是 :“my_w2000_desktop_h100.jpg”,或者更糟糕的 “desktop_for_w2000_h100.jpg”),但是如果你禁止人们双倍增加下划线用文件名,你可以用双下划线来分隔文件名和选项(例如“my_w2000_desktop__h100.jpg”),并在那里分割string(注意上面的正则expression式要求每个选项都以_字符开头)
更简单的选项
如果你可以接受没有在文件名中编码的参数(这可能会导致每个人都有完全不同大小的图像,所有这些都称为“some_funny_kitty.jpg”),那么parsing可以是微不足道的。 这将使用像http://example.com/IMG/w200/h100/folder1/my_w2000_desktop.jpg这样的URL。 从RewriteRule(仅^IMG(.*)$删除“ – ”,然后在PHP中更改parsing:
$parts=explode("/",$_REQUEST["parse"]); $filename=array_pop($parts); $folder=array_pop($parts); foreach ($parts as $field) { $param=substr($field,0,1); $setting=substr($field,1); // assuming settings are always one letter followed by value $values[$param]=$setting; }
如果这是可以接受的,你可以完全消除mod_rewrite:使用表单的URL
http://example.com/imgcpu/w200/h100/folder1/my_w2000_desktop.jpg
而Apache将执行 imgcpu ,并将PHP环境variablesPATH_INFO设置为/w200/h100/folder1/my_w2000_desktop.jpg $_SERVER["PATH_INFO"] )。 这对我来说工作正常,但我已经看到一些post抱怨,在某些环境下PATH_INFO是坏的。