2011-08-23 36 views
0

是否可以在已重寫的URL上應用.htaccess重寫規則?在重寫的URL上應用htaccess重寫規則

例如: 我想用timthumb.php(最新版本,因此應該沒有任何安全缺陷)重新調整圖片大小。但是URL看起來應該不錯,所以我創造了這個重寫規則:

RewriteRule ^rz/(.*)x(.*)/r/(.*) /themes/Nerdtalk/timthumb.php?src=$3&h=$2&w=$1&q=80 

此規則工作正常,但啓動timthumb.php可以重新定向到一個緩存的文件之前,我想阿帕奇檢查,如果文件存在並讓Apache重定向到緩存文件,那麼timthumb.php將不會啓動。 因此,我創建了這個規則集:

RewriteCond %{SCRIPT_FILENAME} timthumb.php 
RewriteCond %{QUERY_STRING} src=(.*)\.(png|jpe?g)&h=([0-9]+)&w=([0-9]+)&q=([0-9]+) 
RewriteCond %{DOCUMENT_ROOT}/cache/%1-%4-%3-1-%5.%2 -f 
RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2 [L] 
  1. 能已經重寫URL重寫第二次?

  2. 第二部分是否正確?

  3. 如果有可能合併這兩個規則集,你能告訴我怎麼做嗎?

回答

2

第二次可以重寫一個已經重寫的URL嗎?

是的。當發生重寫時(規則爲[L]標誌或htaccess結束),mod_rewrite進入下一次迭代並開始再次匹配所有規則。這就是爲什麼你需要用重寫循環來構建你的規則(特別是如果你使用這種模式^(.*)$進行匹配)。

如果你編寫一個沒有[L]標誌的規則,那麼在同一個迭代中繼續重寫,所以任何低於current的規則都可能會將URL重寫爲一個完全不同的規則。

第二部分是否正確?

我會說是(雖然沒有檢查實際的Apache)。我只是不確定第一次重寫的情況(只是從來沒有使用%{SCRIPT_FILENAME}我自己如此不確定它的工作原理) - 我會使用%{REQUEST_URI} timthumb\.php$或類似的東西。

我要添加的唯一東西是?在重寫目標擺脫新創建的(1規則以上)查詢字符串:RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2? [L]。但它現在應該可以正常工作。

如果有可能合併這兩個規則集,請問 告訴我怎麼做?

將他們陸續在你這裏有相同的順序。由於第二條規則只有在縮略圖已經被緩存的情況下才能使用,所以不能將其作爲單個規則。

如果它不會工作,馬上(Apache的變量(%{SCRIPT_FILENAME}, %{QUERY_STRING}等)可能沒有正確的價值觀直線距離)嘗試加入[L]標誌第一重寫規則 - 這將迫使下一次迭代其中填充這些變量與正確的價值觀當然,根據你在這之前可能有的其他規則,它會到達第二個重寫將發生的規則集。

如果你想 - 你可以完全重寫它來直接檢查並提供緩存文件(如果存在的話),然後(如果仍然沒有)重寫圖像由timthumb.php處理,但那樣做會完全相同作爲上述規則工作,只是有點不同。

+0

感謝您的詳細解釋。但是讓Apache處理文件存在檢查而不是每次啓動PHP腳本都不是更快嗎? – Phil

+0

@Phil你在說什麼?我想你很困惑這是如何工作的。請描述你對上述規則的理解。 – LazyOne

+0

第一條規則重寫像/rz/714x357/r/screen.jpg到/themes/Nerdtalk/timthumb.php?src=screen.jpg&h=357&w=714&q=80的URL。 – Phil

0

可以重寫第二次已經重寫的URL嗎?

是的,它可以。這是默認行爲,如果你想改變它,你可以使用像[L]這樣的標誌: http://httpd.apache.org/docs/current/rewrite/flags.html

第二部分是否正確?

我不知道你是否能在RewriteCond指令

使用%1等,如果有合併這兩個規則集的可能性,你能告訴我怎麼樣?

我會把緩存在同一文件夾作爲您的原始網址:()^ RZ /()X/R/ 如果它存在 - 只是爲它服務,如果沒有 - 使用PHP