2013-01-14 37 views
0

,我有以下Apache中的我的虛擬主機部分(2.2),配置簡單的重寫語句和條件阿帕奇重定向 - 條件不匹配正確

RewriteCond %{REQUEST_URI} !-d 
RewriteCond %{REQUEST_URI} !-f 
RewriteRule ^([^\.]{2,})$ /bootstrap.php?url=$1 

的所有請求都很好地重定向到bootstrap.php中,execpt如果該文件存在。這工作正常。但是,如果存在一個目錄,我希望Apache爲該目錄運行DirectoryIndex,或者顯示目錄的內容(無論我選擇什麼設置),但是Apache也會將請求導向到bootstrap.php。似乎第一個rewriteCond不知何故是不正確的。我究竟做錯了什麼?

當進行調試,並試圖加載「本地主機/ IMG」(它存在)我得到以下輸出

127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (2) init rewrite engine with requested uri /img/ 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (3) applying pattern '^([^\.]{2,})$' to uri '/img/' 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (4) RewriteCond: input='/img/' pattern='!-d' => matched 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (4) RewriteCond: input='/img/' pattern='!-f' => matched 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (2) rewrite '/img/' -> '/bootstrap.php?url=/img/' 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (3) split uri=/bootstrap.php?url=/img/ -> uri=/bootstrap.php, args=url=/img/ 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (2) local path result: /bootstrap.php 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (2) prefixed with document_root to C:/webroot/zippyshoot/bootstrap.php 
127.0.0.1 - - [14/Jan/2013:20:18:14 +0100] [localhost/sid#4cd5a8][rid#14442c0/initial] (1) go-ahead with C:/webroot/zippyshoot/bootstrap.php [OK] 

加載本地主機/ IMG/logo.png時工作正常。調試日誌的輸出是

127.0.0.1 - - [14/Jan/2013:20:27:56 +0100] [localhost/sid#4cd5a8][rid#237d978/initial] (2) init rewrite engine with requested uri /img/logo.png 
127.0.0.1 - - [14/Jan/2013:20:27:56 +0100] [localhost/sid#4cd5a8][rid#237d978/initial] (3) applying pattern '^([^\.]{2,})$' to uri '/img/logo.png' 
127.0.0.1 - - [14/Jan/2013:20:27:56 +0100] [localhost/sid#4cd5a8][rid#237d978/initial] (1) pass through /img/logo.png 

我做錯了什麼?

+0

¿文件不存在時會發生什麼?例如:'localhost/img/test.test'?據我所知,條件不匹配,規則不適用,應該生成「找不到」的錯誤。如果是這樣,當請求是一個文件時,規則被跳過,如果存在或不存在,則該規則不相關。 –

+0

當文件不存在時,我得到一個錯誤,說「該文件在服務器上不存在」,所以在這種情況下重寫規則不適用 – user410932

+0

所以,'所有請求都很好地重定向到bootstrap.php,如果文件存在,則執行'不準確,事實是這個規則只適用於目錄,更確切的說:只適用於沒有句點'。'的字符串,這就是它們總是被傳遞給'bootstrap.php'的原因。作爲參數,如果它們存在或不存在則不相關。 –

回答

1

我找到了問題的答案在這個崗位 http://amandine.aupetit.info/135/apache2-mod_rewrite/

由於Apache的2.2,該的RewriteCond改變。正確的方式寫他們現在

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