2013-12-15 33 views
0

這是我的.htaccess文件。如果url匹配,它應該從assets文件夾傳送靜態文件。否則,一切都應該重定向到index.php爲什麼mod_rewrite忽略我的[L]標誌?

請注意,url不包含assets as segemnt here。所以example.com/css/style.css指向assets/css/style.css

RewriteEngine on 

# disable directory browsing 
Options -Indexes 

# static assets 
RewriteCond %{DOCUMENT_ROOT}/assets/$1 -f 
RewriteRule ^(.*)$ assets/$1 [L] 

# other requests to index.php 
RewriteRule !^asset/ index.php [L] 

遺憾的是,類似的URL也example.com/assets/css/style.css提供的文件,因爲對我的規則,網址均不適用,並應用於Apache的默認行爲,它提供的文件。

所以我試着改變最後一行。我認爲這是可行的,因爲上面的規則中的[L]標誌應該停止執行資產網址並投放它們。

RewriteRule ^(.*)$ index.php [L] 

取而代之的是,並非所有的請求重定向到index.php,甚至像example.com/css/style.css靜態資產。爲什麼標誌不停止執行重寫規則以及誰來解決我的問題呢?

回答

0

我在official documentation的頁面上找到了解決方案。

如果您正在使用重寫規則在任何.htaccess文件或 部分,它有 一些瞭解規則是如何處理是很重要的。這種簡化形式是,一旦處理了規則 ,重寫的請求就被傳回到URL解析引擎 以完成它的任務。有可能 作爲重寫的請求被處理,可能會再次遇到.htaccess文件或 部分,因此規則集可能會從頭開始再次運行 。最常見的情況是,如果 規則之一導致重定向(無論是內部還是外部重定向),則會導致 請求過程重新開始。

是很重要的,如果你正在使用的RewriteRule指令在這些背景下的 之一,您採取明確的措施,以避免規則 循環,而不是在[L]標誌僅數終止了一系列的執行 的規則,如下所示。

替代標誌[END]可用於終止當前一輪重寫處理,但不會終止在每個目錄(htaccess)上下文中進行的任何後續重寫處理。此 不適用於由外部重定向產生的新請求。

要解決我的問題,我更改爲[L]標誌爲[END]

RewriteEngine on 

# disable directory browsing 
Options -Indexes 

# static assets 
RewriteCond %{DOCUMENT_ROOT}/assets/$1 -f 
RewriteRule ^(.*)$ assets/$1 [END] 

# other requests to index.php 
RewriteRule !^asset/ index.php [END]