2011-07-28 10 views
1

多くのフレームワークと同じことを達成しようとしています。要求が.php(つまりindex.php)で処理され、/application/publicというフォルダにすべての要素それらが存在する場合に表示する必要があります。例えば:それが存在するファイルが他の場所に存在する場合にRewriteRuleを実行する方法

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.jpgexample.com/index.php?uri=images/a.jpgなってしまいます)。

Apacheはのみ(example.com/javascript/index.phpを要求する場合)次のことを示して記録します、あなたが想像できるように、これは/ home/jbayardo/WWW /テスト/ javascriptの

ファイルが存在しないと空に私を残す。

答えて

3
  1. は、最初のRewriteCondラインの末尾に[OR]を追加します。

    現在ロジックはANDです:を「それが存在し、それが存在するフォルダであれば、ファイルの場合は、」現在、それは本当のことができない... として読み込む - 条件が満たされていないとリライトは発生しません。 。

    「ファイルが存在する場合、または存在するフォルダの場合」が必要です。

    docs:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond(少しスクロールする必要があります)をご覧ください。

  2. ルール#1が正常に動作しても、Apacheに何を伝えているのかによって、それはまだindex.php?uri=$1に書き直されます。すでに書き直された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

これは完全に働いた、どうもありがとうございました。 –

関連する問題