2010-08-14 33 views
1

所以我正在一個CSS/JS壓縮系統的一個網站,有基本以下的htaccess重寫問題 - L(ast)沒有被尊重?

RewriteEngine On 

... 

RewriteRule ^css/images/(.*)$ images/site/$1?%{QUERY_STRING} [L] 
RewriteRule ^css/([0-9a-fA-F]{32})$ assets.php?hash=$1 [L] 

RewriteCond %{HTTP_HOST} ^www.site.com [NC] 
RewriteRule ^(.*)$ http://site.com/$1 [L,R=301] 

RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L] 

php_flag register_globals off 
php_flag magic_quotes_gpc off 
php_flag register_long_arrays off 

# 404 Handler 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING} 

眼下assets.php沒有接收到哈希調用,而是index.php文件 - 如果我刪除線RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]

它工作正常,但我不知道爲什麼 - 資產重寫RewriteRule ^css/([0-9a-fA-F]{32})$ assets.php?hash=$1 [L]上的[L]標誌不應該阻止任何進一步的重寫被執行?我對這裏發生的事情感到困惑。

任何你可以擺脫這一點的光將不勝感激。

回答

7

L標誌表示「不要在規則集中執行更多規則」,這足夠奇怪並不意味着mod_rewrite將不會執行更多規則。

當你指定一個目錄級的mod_rewrite指令,就像.htaccess或者服務器或虛擬服務器配置的Directory部分,重寫來得晚在Apache處理階段。要在這裏發揮它的魔力,mod_rewrite必須在每次重寫URL時執行內部重定向。

由於您的重寫可能會指向不同的目錄,因此mod_rewrite將自身指定爲此重定向的處理程序,以便它可以檢查在發送請求的新位置可能找到的任何規則。通常,由於您只處理根文件中的一個.htaccess文件,因此「新」位置中的規則碰巧是導致首先重寫的文件。

所以,在你的情況下,會發生以下情況:

  • 申請/css/A01EF
  • mod_rewrite啓動規則集
  • ^css/([0-9a-fA-F]{32})$ -> assets.php?hash=A01EF
  • L標誌停止重寫和部隊內部重定向作出assets.php?hash=A01EF
  • mod_rewrite再次啓動規則集
  • ^([a-zA-Z0-9_.-]+)$ - >index.php?url=assets.php&hash=A01EF(你可以使用QSA這裏,順便說一句)
  • L標誌停止重寫和部隊內部重定向到index.php?url=assets.php&hash=A01EF

這可能是因爲這個循環將繼續,但mod_rewrite認識你'重新定向到同一頁面並在此之後忽略您的重寫。

這整個過程恰好是爲什麼兩個條件......

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

...在.htaccessmod_rewrite規則集如此普遍,因爲他們提供了一個簡單的方法來確定該網址已被重寫爲預期的實際資源。你可以使用它們,或者您可以排除當請求已被重寫,assets.phpindex.php改寫:

RewriteCond %{REQUEST_URI} !^/assets.php 
RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L] 
+0

謝謝各位大大順便說一句,這真的回答我的問題。 – donatJ 2010-09-01 17:42:06