Apache-2.2

url重寫以使生成 的縮略圖像靜態一樣記憶體,這是一個語法問題

  • December 15, 2010

**這是一個痛苦的問題!*給定:大多數代理,不要用“?”記憶體資源 即使響應中存在 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 將 imgcpuPATH_INFO環境變數設置為/w200/h100/folder1/my_w2000_desktop.jpg($_SERVER["PATH_INFO"]在 PHP 中) 的情況下執行。這對我來說很好,但我看到一些文章抱怨在某些環境中 PATH_INFO 被破壞了。

引用自:https://serverfault.com/questions/212681