2011-07-15 71 views
1

目前,我有這些規則在我的.htaccess文件:如何只在當前目錄上使用mod_rewrite?

<IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteRule ^(.*).css style.php?u=$1 [QSA] 
     RewriteRule ^(.*).xml rss.php?u=$1 [QSA] 
</IfModule> 

這將改寫以下網址:

http://domain.com/user.css 
http://domain.com/user.xml 

但是,當我試圖抓住從一個子目錄中的文件:http://domain.com/css/style.css它也被重寫。

我的目標是僅針對當前目錄重寫並避免子目錄,因爲子目錄上的所有真正的CSS文件都將被重寫。

我該如何避免這種情況?

+0

1)這個.htaccess位於 - 根文件夾或其他地方? 2)據我所知,這些規則是重寫請求到僅位於根文件夾中的.css/.xml(例如'http:// domain.com/user.css'),並且您不希望這些規則重寫請求子文件夾中的.css文件(例如'http:// domain.com/css/style.css')? – LazyOne

+0

1-是的,htaccess文件位於style.php和rss.php的相同目錄中。
2-是的,我只想重寫當前目錄的規則,但是當加載http://domain.com/css-or-some-dir/somefile.css時,somefile調用位於根目錄下的style.php。 – greenbandit

回答

3

你需要做您的模式更具限制性:此^(.*).css將與其中的.css匹配任何內容,而此模式^([^/]+)\.css$將限制爲something.cssstyles\something.css不會與它匹配)。

<IfModule mod_rewrite.c> 
     RewriteEngine On 

     # do not do anything to real files or folders 
     RewriteCond %{REQUEST_FILENAME} -f [OR] 
     RewriteCond %{REQUEST_FILENAME} -d 
     RewriteRule .+ - [L] 

     RewriteRule ^([^/]+)\.css$ style.php?u=$1 [QSA,L] 
     RewriteRule ^([^/]+)\.xml$ rss.php?u=$1 [QSA,L] 
</IfModule> 
+0

嗨,並感謝上述答案,我還有一個問題:我有一個真正的css文件位於同一目錄,並且也被重寫,我如何避免,如果文件名是style.css? – greenbandit

+0

檢查我更新的答案。這是一種方式。另一個 - 在RewriteRule ^([^ /] +)\。css $ style之前添加'RewriteCond%{REQUEST_URI}!=/style.css' **或**'RewriteCond%{REQUEST_FILENAME}!-f'行。 php?u = $ 1 [QSA,L]'。這真的取決於哪個更好。如果你有很多重寫規則,那麼答案可能會更好。 – LazyOne

0

最簡單的方法是告訴mod_rewrite的,以避免重寫,如果該文件是一個真實的文件:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^(.*).css   style.php?u=$1 [L,QSA] 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^(.*).xml   rss.php?u=$1 [L,QSA] 

我添加了一個[L]標籤(結束),因爲一旦規則被應用於肯定你不需要檢查下一個規則。

現在,如果文件確實存在,但你真的想用一個PHP腳本來處理他們,如果沒有「CSS」子目錄存在於URL ......讓我們試試:

<Location "/css"> 
    RewriteEngine off 
</Location> 
+0

也許你誤會了我,我想只爲當前目錄重寫這些文件,並避免所有的子目錄。 – greenbandit

相關問題