2011-12-04 4 views
0

私はPHPで 'deny all'コマンドを使って保護されているバックアップディレクトリの内容をリストアップしようとしています。 htaccessファイル。PHPスクリプトは、 'deny all'(Via .htaccess)ディレクトリにアクセスします。

これはWordPressのバックアッププラグインである理由は管理者だけが利用でき、私は単純なダッシュボードウィジェットを使用してオンラインからバックアップをダウンロードできるようにしたいと考えています。

私が使用しているコードは、htaccessファイルのために403エラーが発生したときに見つかります。

//define the directory (this is where the backup plugin store the .zip files) 
$directory = site_url() . "/wp-content/backups/"; 

//display the generated directory for testing 
echo '<b>Scanning: </b>' . $directory . '</br></br>'; 

//display a link to a test.zip I know exists for testing 
echo '<b>Manual Link: </b> <a href="' . $directory . 'test.zip" target="_blank">test.zip</a></br></br>'; 

//get all files in the directory with a .zip extension. 
$files = glob($directory . "*.zip"); 

//print each file name as a download link 
foreach($files as $file){ 
    echo '<a href="' . $file . '">' . $file . '</a> </br>'; 
} 

ご協力いただければ助かります。

ありがとう、 アンディ。コード上の

更新することをグロブが正しく

//Define the backup folder location 
$backup_location = "wp-content/backups/"; 

//Set the file directory for glob 
$directory = $_SERVER['DOCUMENT_ROOT'] . $backup_location; 

//Prints the directory for testing purposes 
echo '<b>Scanning: </b>' . $directory . '</br></br>'; 

//Filter the discovered files 
$files = glob($directory . "*.*"); 

//Echo the filtered files 
foreach($files as $file){ 
    echo '<a href="' . site_url() . '/' . $backup_location . basename($file) . '">' . basename($file) . '</a> </br>'; 
} 
+0

site_url()は何を返しますか? –

+0

サイトURL(WPバックエンドで定義されています)を返すWordPress変数です。他のコメントから、グロブはURLで動作しないようですが。 –

+0

はい、そうです.GlobはHTTP経由では動作しません。代わりにローカルパスを使用してください。 htaccessはファイルシステム経由のアクセスを制限しないので、問題はないはずです。 –

答えて

1

に動作しますので、あなたは、現在だけで、ユーザーがアクセス権を持っていないファイルへのリンクを提供しています。これは、権利を追加することなく動作しません。

この設定では、現在のページを使用して実際にファイルをユーザーに提供することができます。

あなたが基本的にやっていることは、ファイルを読んで(そのファイルへのアクセス権を持っている)、ユーザーにヘッダーとそのあとの内容を送信させることです。あなたがHTTP経由でディレクトリ一覧を行うことはできません

$directory = site_url() . "/wp-content/backups/"; 

:あなたの問題はこれです

http://php.net/manual/en/function.readfile.php

<?php 
$file = 'monkey.gif'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
?> 
+0

ありがとうございます。グロブが返すファイル名に基づいてファイル名を生成するので、複数のファイルが存在する可能性があります。このスクリプトを使用してダウンロードリンクを表示するにはどうすればよいですか? –

+0

最初のスクリプトを使用してリンクを作成しますが、上記のスクリプトとgetパラメータ( '/site/downloadfile.php?file = yourfilename')を使ってファイルにリンクします。いくつかのチェックを行い、必要なファイルだけが提供されるようにしますが、最後に '$ file = $ _GET ['file']'を使用してファイル名を取得します。 – Nanne

1

:PHPマニュアルからの例のようなコードを使用してください。それは動作しません(アクセス制限に関係なく)。ローカルディレクトリで​​3210などを実行する必要があります。

$directory = "./wp-content/backups/"; 

それは右globマニュアルページにあるように、こう述べています。

注:ファイルが調べられるようこの機能は、リモートファイル上では動作しません、サーバーのファイルシステムによりアクセスできる必要があります。

+0

ありがとうございます。この動作を反映するようにコードを変更しました。アクセスの問題を回避することはできませんが、そうでないとコードが誤って動作すると主張するのを止めます;)(コードのメールQの更新を参照してください) –

+0

いいえ、何を言っているのでしょうか。しかし、#Nanneが説明したようにアクセスラッパーを実装しない限り、直接ダウンロードリンクは明らかに失敗します。 – mario