2011-03-20 38 views
0

審視自己當前的URL重寫加載圖片:與htaccess的URL重寫與Apache卡住:1條規則來統治他們

// Possibiities: 1 letter char, followed by `=` then the value (numbers/letters) 
// w= | h= | c= | q= | f= 

IMG-bla/blue_w100.jpg   >> imgcpu?src=bla/blue.jpg&w=100 
IMG-bla/blue_cp.jpg    >> imgcpu?src=bla/blue.jpg&c=p 
IMG-bla/blue_h200.jpg   >> imgcpu?src=bla/blue.jpg&h=200 
IMG-bla/blue_w50_h200_fbw.jpg >> imgcpu?src=bla/blue.jpg&w=50&h=200&f=bw 

基本上我想有1個終極重寫URL,這給我的自由地重寫下面的網址與任何財產,而不必硬編碼重寫的確切順序,每個可能性一個規則:目前我的代碼是非常愚蠢的,不實際的&不完整的,它的不雅,思想確實有用!

// works but utterly unelegant and unpractical as well as incomplete: 
RewriteRule ^IMG-(.+)_w(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2 [L] 
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2&h=$3&c=$4 [L] 
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_f(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2&h=$3&f=$4 [L] 

現在,我怎麼可以重寫與可選的物業資產這種複雜的規則?我在尋找那1條規則來統治他們。您的想法&建議熱烈歡迎,我美味地upvote任何敢於解決這個複雜的難題!

回答

1

在進入這個非常通用的解決方案之前,我考慮了幾種方法。在這裏,我重複了幾次相同的規則。這是一種分而治之的策略,每次執行規則時,都會提取一個參數。

# Generic rule for extracting one parameter 

RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA] 

# Final rule which does the actual rewrite 
RewriteRule IMG-([a-z0-9]+/[a-z0-9]+\.jpg) /test/index.php?src=$1 [QSA] 

讓我們打破D & C規則到更小的部分!

^(IMG-[a-z0-9]+/[a-z0-9]+)這部分是匹配但保留。結果是$ 1。

_單下劃線。這是匹配但丟棄。

([a-z0-9])匹配單個字母或數字(顯然是在undorscore之後)。這是$ 2並且被假定爲參數名稱。

([a-z0-9]+)匹配一個或多個字母或數字。結果中$ 3,並假定爲參數值。

([_.].*)$匹配單個下劃線或句點,以及其他所有內容一直到請求字符串的末尾。這是4美元。

所以對於每一步,一個參數被提取(如果有一個匹配,這是),然後將其附加到查詢字符串QSA的幫助。請求的其餘部分,1美元4美元捆綁在一起,並準備好另一輪。沖洗並重復,直到我們超出參數或達到可用的最大規則數量。

到最後的規則匹配什麼應該是一個路徑和文件名到那時。 這些步驟如下:

IMG-bla/blue_w50_h200_fbw.jpg -> IMG-bla/blue_h200_fbw.jpg?w=50 [with QSA] 
IMG-bla/blue_h200_fbw.jpg  -> IMG-bla/blue_fbw.jpg?h=200  [with QSA] 
IMG-bla/blue_fbw.jpg   -> IMG-bla/blue.jpg?f=bw   [with QSA] 

(沒有更通用的規則,會匹配)

IMG-bla/blue.jpg    -> /test/index.php?src=bla/blue.jpg [with QSA] 

總計的查詢字符串被追加後:

/test/index.php?src=bla/blue.jpg&f=bw&h=200&w=50 

請注意,我在做幾個假設...

  • 一切(除了下劃線,目錄斜槓和句點)是一個字母或數字。如果文件或參數可能包含國際字符,可能會對您太嚴格。
  • 參數名稱總是一個字符長,但不需要明確列出。
  • 圖像將不會超過一個子文件夾深(容易修復。)

告訴我你的想法。

+0

+1這是一個很棒的答案。我無法相信你在這個瘋狂的追求中支持我!它非常短而聰明。不幸的是,它不工作,但是,哎呀...看到我更新的答案,尤其是我必須編輯的最後一行代碼,以匹配坐在根中的我的imgcpu。 – Sam 2011-03-21 04:03:52

+0

如果它不起作用,可能是因爲任何事情。想到的事情:1)您嘗試訪問的映像位於(虛擬)子目錄中。 2)在最後一條規則中,我忘了NC,因此路徑/文件名部分中任何帶大寫字母的內容都將失敗(404)。嘗試轉換到[NC,QSA]那裏。 3)別的東西。你有重寫日誌嗎? – nitro2k01 2011-03-21 18:37:04

+0

非常感謝您的反饋。嘗試在最後一條規則中添加'NC,'infront OS QSA,但是相同:沒有圖片。我沒有重寫日誌啓用,因爲我不知道如何,這將是非常酷如果我能做到這一點,任何有用的鏈接,指示如何啓用日誌重寫? – Sam 2011-03-21 19:53:41