这真是一个令人头痛的问题!!鉴于:大多数代理不会缓存 URL 中带有“?”的资源,即使响应中存在 Cache-control:公共标头。为了启用这些资源的代理缓存,我从对静态资源的引用中删除了查询字符串,但代价是 apache 正则表达式代码非常丑陋!*
第 1 部分完成 和线索来自两位天才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 结尾,分隔符以 .jpg 结尾
IMG-folder1/some_file_w100_h200.jpg
(漂亮的静态 .jpg url)
imgcpu?src=folder1/some_file.jpg&w=100&h=200
(丑陋的文件 url)
答案1
由于 imgcpu[.php] 可以更改,因此这是我清理这个问题的答案,即使它会撤消你所做的大量工作
在程序中,您可以循环遍历所有可能的属性并提取存在的属性(以任何顺序!)。您可以用一条规则替换所有这些规则:
RewriteRule ^IMG-(.*)$ imgcpu\?parse=$1 [L]
然后在 imgcpu 脚本中,您将“parse”作为包含的变量folder1/some_funny_kitty_w3500_h10_cp_q90.jpg
。从末尾删除扩展名,从开头删除文件夹和文件名,然后您可以循环遍历各种参数并从字符串中提取它们。类似于(PHP,但该概念可以用任何语言实现。您甚至可以通过在不使用正则表达式的情况下执行此操作来节省几毫秒):
$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”)并在那里拆分字符串(请注意,上述正则表达式要求每个选项都以 _ 字符开头)
更简单的选择
如果您可以接受不将参数编码在文件名本身中(这可能导致每个人拥有完全不同大小的图像,但都称为“some_funny_kitty.jpg”),那么解析就变得很简单。这将使用类似 的 URL http://example.com/IMG/w200/h100/folder1/my_w2000_desktop.jpg
。从 RewriteRule 中删除“-”(只需^IMG(.*)$
,然后在 PHP 中更改解析:
$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
将PATH_INFO
环境变量设置为/w200/h100/folder1/my_w2000_desktop.jpg
($_SERVER["PATH_INFO"]
在 PHP 中)。这对我来说很好,但我看到一些帖子抱怨在某些环境中 PATH_INFO 被破坏了。