2012-02-22 12 views
0

私はPHPでかなり単純なファイルブラウザを開発しています。PHPファイルブラウザmod_rewrite

ファイルはホーム/ウェブ/ WWW /アーカイブ/に

に位置しているアーカイブの下で対応するファイルと一致する必要があり、要求は/ファイルが

/files/sub/file.txt => /home/web/www/archive/sub/file.txt (dump as is) 
/files/file.png => /home/web/www/archive/file.png (dump as is) 
/files => /home/web/www/archive (directory, handled by /home/web/www/index.php) 
/files/sub => /home/web/www/archive/sub (directory, handled by /home/web/www/index.php) 

である、それはだ場合、私は私の.htaccessファイルが認識したいですアーカイブの下にあるファイル/の場合はそのままファイルを出力します。それをindex.phpに送信しない場合。

答えて

0

あなたの.htaccessで以下の内容は、あなたのindex.phpにファイルではない何かを送信します

RewriteCond %{REQUEST_URI} !\/files\/(.*)\.[a-z]+$ 
RewriteRule .* index.php 

ので、ファイル名の終了を持っていない任意の要求(.JPG、.BAT、。 txt、.etc)があなたのインデックスに移動します。

これで更新されました。

+0

要求が直接ので、これは動作しないファイルを指していません。 – user568068

+0

あなたの質問では、リクエストは '/files/sub/file.txt =>/home/web/www/archive/sub/file.txt'または'/files/sub =>/home/web/www/archive/sub'と入力します。したがって、最初の要求はファイルを直接指しているので、htaccessは無視し、2番目の要求はフォルダーを指しているので、インデックスに移動します。 – Avanche

+0

リクエストが/ filesの場合、REQUEST_FILENAMEは/ home/web/www/archiveと一致しません。存在しない/ home/web/www/filesにマッチしようとします。リクエストは** never **/archiveです。 – user568068

1

あなたはそのため-fフラグを使用することができます。

RewriteEngine On 

# if the request is for /archive.. 
RewriteCond %{REQUEST_URI} ^\/archive\/ 
# and the request is not for a file 
RewriteCond %{REQUEST_FILENAME} !-f 

# send to index.php 
RewriteRule .* index.php [L] 

これは、非既存のファイルへのファイルの要求をindex.phpにリダイレクトすることに、注意してください。ディレクトリRewriteCond %{REQUEST_FILENAME} -dのポジティブチェックを追加することができるので、ディレクトリを要求した場合にのみリダイレクトされます。

Documentation in the apache docs with all flags like -f, -d, ...

+0

リクエストは/ archiveではありません.../files ...なので、私は!-fを直接使用することはできません。 – user568068

0
RewriteCond %{REQUEST_URI} ^/files/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/archive/%1 -f 
RewriteRule .* %{DOCUMENT_ROOT}/archive/%1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 
関連する問題