url重寫以使生成 的縮略圖像靜態一樣記憶體,這是一個語法問題
**這是一個痛苦的問題!*給定:大多數代理,不要用“?”記憶體資源 即使響應中存在 Cache-control: public 標頭,在他們的 URL 中也是如此。為了為這些資源啟用代理記憶體,我已經從對靜態資源的引用中刪除了查詢字元串,但代價是非常醜陋的 apache 正則表達式程式碼!
第 1 部分 用兩位天才的線索完成
Dennis Williamson & Mark Henderson
第 2 部分這裡 這個問題涵蓋了第二部分:使程式碼優雅且不那麼整潔
以前有
<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 $$可以更改,這是我清理此問題的答案,即使它會撤消您所做的很多工作 在程序中,您可以遍歷所有可能的屬性並提取存在的任何屬性(以任何順序!)。您可以用一條規則替換所有這些規則:
RewriteRule ^IMG-(.*)$ imgcpu\?parse=$1 [L]
然後在 imgcpu 腳本中,您將“解析”作為包含
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”),那麼解析可以變得微不足道。這將使用像
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 被破壞了。