2011-07-28 71 views
1

我一直在嘗試完成相同的許多框架:通過.php(即index.php)處理請求,同時保留包含所有元素的/application/public文件夾應該顯示它們存在的情況。例如:如何重寫規則,如果文件存在其他地方

folder /application/public 
total 28K 
92897619 drwxr-xr-x 5 1001 1001 4.0K Jul 29 00:07 . 
92897616 drwxr-xr-x 7 1001 1001 4.0K Jul 28 23:31 .. 
92897754 -rw-r--r-- 1 1001 1001 15 Jul 29 00:07 .htaccess 
92897733 drwxr-xr-x 2 1001 1001 4.0K Jul 28 23:31 images 
92897620 -rw-r--r-- 1 1001 1001 696 Jul 28 23:58 index.php 
92897625 drwxr-xr-x 2 1001 1001 4.0K Jul 28 23:31 javascript 
92897734 drwxr-xr-x 2 1001 1001 4.0K Jul 28 23:31 stylesheets 

folder /: 
total 24K 
92831996 drwxr-xr-x 4 1001 1001 4.0K Jul 29 02:44 . 
91980897 drwxr-xr-x 5 0 0 4.0K Jul 6 00:30 .. 
92831975 -rw-r--r-- 1 1001 1001 360 Jul 29 02:44 .htaccess 
92897616 drwxr-xr-x 7 1001 1001 4.0K Jul 28 23:31 application 
92832733 -rw-r--r-- 1 1001 1001 696 Jul 29 00:02 index.php 
92897739 drwxr-xr-x 6 1001 1001 4.0K Jul 28 23:31 system 

如果沒有爲example.com/images/a.jpg的請求,/application/public/images/a.jpg應當被顯示,由於它的存在。否則,index.php將獲得?uri=images/a.jpg作爲查詢字符串。

考慮到這一點,我寫了下面的.htaccess(放在/):

Options +FollowSymLinks +Indexes 
RewriteEngine on 
RewriteBase/
RewriteCond %{DOCUMENT_ROOT}/application/public%{REQUEST_URI} -f 
RewriteCond %{DOCUMENT_ROOT}/application/public%{REQUEST_URI} -d 
RewriteRule ^(.*)?$ application/public/$1 [L] 
RewriteRule ^(.+)?$ index.php?uri=$1 [PT,QSA,L] 

儘管如此,請求在/application/public任何存在的請求重定向index.php(例如,example.com/images/a.jpg最終被example.com/index.php?uri=images/a.jpg )。

Apache日誌只顯示以下(請求時example.com/javascript/index.php):

文件不存在:/家庭/ jbayardo/WWW /測試/ JavaScript的

這一點,你可以想像,把我留在空白處。

回答

3
  1. 在第一個RewriteCond行的末尾加上[OR]

    目前的邏輯是AND:目前它的內容「如果這是一個真實存在的文件,如果它是一個真實存在的文件夾」 ..這不可能是真的 - 條件不成立,改寫不會發生。

    您需要「如果它是存在的文件或存在的文件夾」

    請參閱文檔:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond(您必須向下滾動一下)。

  2. 即使規則#1可以正常工作,它仍然會被重寫爲index.php?uri=$1 - 因爲那就是你告訴Apache要做的事情。您需要添加一個條件來防止重寫已經重寫的URL(請記住,當Apache重寫URL時,它會轉到下一次迭代,並且從頭開始再次匹配所有規則 - 它是如何工作的)。

  3. 在RewriteRule模式中的?是不需要的。

這就是我看待它:

Options +FollowSymLinks +Indexes 

RewriteEngine on 
RewriteBase/

RewriteCond %{DOCUMENT_ROOT}/application/public%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/application/public%{REQUEST_URI} -d 
RewriteRule ^(.+)$ application/public/$1 [L] 

RewriteCond %{REQUEST_URI} !^/(application/public/|index.php) 
RewriteRule ^(.*)$ index.php?uri=$1 [PT,QSA,L] 
+0

這完美地工作,非常感謝你。 –

相關問題