2011-10-17 3 views
-1

これらのPHPダウンロードページ(somesite.com/download.php?id=somefileなど)はしばしばどのように機能しますか?PHPダウンロードページ

私は当初、カウンタの処理を行い、ユーザーをファイルURLにリダイレクトしました(これは、他の場所での唯一の回答と思われますが、すべての機能がどのように提供されているか分かりません)しかし、これは直接リンクを妨げるものではなく、いくつかのファイルをパスワードで保護することはできません。一部のサイトでは、ダウンロード速度制限(ユーザーアカウントに基づく)、キューユーザーなども実装されているようです。

+1

正直、私はその質問を理解していません。もっと説明できますか? –

+0

この質問はよく調査されているようではなく、多くの提案された回答に関する質問者のコメントや有意義なフォローアップの質問がないため、HTTPの "ダウンロード"メカニズムの仕組みを学ぶことに真に関心がないようですクライアント。従って-1。 – Peter

+0

@ファイアランサー:コメントが追加されています。あなたが好きではないダイレクトリンクの例を提供するためにそれを編集し、あなたが望むパスワード保護についてのいくつかの詳細を提供するならば(そして、なぜハードコードされた.htaccessファイルが 'あなたのために働く)。 – Peter

答えて

2

一般に、これらはファイルのURLにリダイレクトされません。代わりに、readfile()を使用して、URLがどこに格納されていても(通常、Webルートの外側のどこか)URLを直接出力します。ダイレクトリンク、パスワード保護、キューイングなどの問題を解決します。スピードリミットは、Webサーバー側で行う必要があります。

+0

ああ、私は、スクリプト自身がウェブサーバではなく、自分のことをやっているファイルを提供すると思っていませんでした( "このファイルへのこのクライアントのアクセスを許可するためにApacheに指示する機能を探していました。私は多くのページで部分的なダウンロードを再開するのがなぜうまくいかないのでしょうか?私のファイルのいくつかがかなり大きいので、私のファイルのいくつかはかなり大きいので、私はその問題を回避しています。私は、ユーザーがすべてを送り返して、接続が99%で落ちるのを望んでいないと思っています:) –

+0

readfileはウェブサーバ自体に比べてかなり最適に動作しますか?私は非常にCPUとRAMは私のサーバー上で制限されています。 –

+0

あなたは問題のように思えるApacheワーカーを縛るつもりです。 Amazon S3でダウンロードをホストし、有効期限が切れている署名付きURLを使用すると、あなたのための潜在的に良い選択肢になります。 http://stackoverflow.com/questions/6540925/amazon-s3-signed-url-in-phpにはPHPの例があります。 – ceejayoz

0

クッキー、IPアドレス、Reffererリンク、ブラウザ名など、多くのことを追跡しています。

+0

勇敢で明瞭なSOユーザーからのもう一つの色落ち... – Peter

+0

私の色調は一貫していると思います。私は書くべきだと思います。 CGI/mod_phpスクリプトがHTTPリクエストに関する情報を収集(およびログ)できることをあなたに説明しています。 – Peter

+0

ちょうどこれをupvoted、私のdownvote wasntので、私は均等化することができます –

0

これはPHP固有の問題ではありません。 Webブラウザを「ダウンロード」(静的ファイルの内容であるか、動的に生成されたレポートの本文であるかにかかわらず)にするには、Content-Disposition header in the HTTP responseを設定します。 PHPではheader関数を使用してHTTPヘッダーを設定できるため、HTTPクライアントにファイルの内容をストリーミングする前にPHPスクリプトがこれを行う必要があります。

+0

コメントなしのDownvote = [弱いソース](http://www.urbandictionary.com/define.php?term=weaksauce)。 – Peter

0

DownloadFile()関数の前にセキュリティ検証を行うと、user_sessionを使用するか、またはパスワードをクエリの一部として送信することで、ファイルを簡単に保護できます。

+0

ダウンロードファイルは?他のファイルへのリダイレクトは、人々が実際のファイルを直接リンクできるので動作しません。 –

+0

@FireLancer:atbyrdはリダイレクトするようには言わなかった - これは自分の考えであるようです。あなたはこれをdownvoteしましたか(明白な理由なし)? – Peter

1

はほとんどの場合、それはPHP関数readfileを使用して行われます:

if(is_allowed_to_download()){ 
    header("Content-Disposition: attachment; filename=".basename($file)); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Length: ". filesize($file)); 
    header("Content-Transfer-Encoding: binary"); 

    @readfile($file); 
    exit; 
} 

は少ないが、サーバー固有のソリューションを使用している - mod_xsendfileとlighttpdのとApacheのヘッダX-SendFile: file-location.exeを送信する(nginxのは、いくつかの同等のものを持っています)。 httpサーバーはコンテンツを提供するように最適化されており、Rangeヘッダー(ダウンロードアクセラレータ用)のような高度な使用が可能です。