それらが含まれているWebサイトからディレクトリ内のファイルへのアクセスのみを許可する
似たような質問がたくさんあることは知っています。それらすべてを調べましたが、どの解決策も機能しないようです。
Webサイトのルートに、ユーザーがログインしたときにサイトから表示およびダウンロードできるアップロードされたファイルを含むフォルダーがあります。これらは次のとおりです。 https://example.com/uploads(例えば)。ユーザーがダウンロードできるように、サイトに引き続きアクセスして表示(一部は画像)し、ダウンロード用のリンク(pdfなど)を提供できるようにする必要がありますが、のURLを取得する人は避けたいです。次のように、それらを直接ダウンロードできる特定のファイル:https://example.com/uploads/2020/02/myfile.pdf。または、これらのURLが検索エンジンに入る(または、そうする場合、サーバーはそれらが直接アクセスされるのを防ぎます。
次の内容の.htaccessファイルをuploadsディレクトリに追加しようとしました。
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
そして、私は試しました
Order Allow,Deny
Deny from all
Allow from 127.0.0.1
...私が読んだように、それはサイト自体からのHTTPS呼び出しとローカルURLを許可するかもしれません。
しかし、それはサイトと直接のURLリクエストを禁じています。それは良くありません。
これを行う方法はありますか?
回答
ファイルへの「公式」アクセスを提供するユーザーインターフェイスにはユーザー認証がありますが、ファイルはディレクトリに存在しているため、URLを知っていれば誰もがファイルにアクセスできなくなります。
ユーザーインターフェイスへのアクセスを保護するために使用しているのと同じ認証システムを使用してファイルを保護する必要があります。これらのリソースをIPアドレス(クライアントIPアドレス)で保護できる唯一の方法は、現在試みて.htaccess
いるように、クライアントのIPが修正され、事前にわかっている場合です(ただし、この場合、別のIPアドレスは必要ありません)そもそも認証の形式)。
したがって、これは主に、「ユーザーインターフェイス」の認証に使用されているスクリプト言語/ CMSでの演習になります。
に使用できるの.htaccess
は、これらのファイルの要求を、認証を処理し、認証されるとクライアントにファイルを提供するサーバー側スクリプトに書き換えることです。
例えば:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^uploads/. /serve-protected-file.php [L]
有効なファイルにマップする/uploads/<something>
(など/uploads/2020/02/myfile.pdf
)のリクエストはすべて、スクリプトにルーティングされます/serve-protected-file.php
。
/serve-protected-file.php
次に、次のようなことを行う必要があります。
// 1. Parse the file being requested from REQUEST_URI
// 2. Is the requested file "protected"?
// (Serving both protected and public files from the same directory?)
// 3. If not protected then serve/stream the resource to the client. END
// 4. If protected then authenticate the user...
// 5. If user authenticated then serve/stream the resource to the client. END
// 6. Resource is protected and user not authenticated...
// Serve a 403 Forbidden. END
(理想的には、これらの「保護された」リソースの場所は完全にドキュメントルートの外側にあるため、デフォルトでは「プライベート」であり、ユーザーがこれらのリソースにアクセスするために使用するURLは完全に仮想です。おそらく必要ありません。追加のコーディング.htaccess
とすべてはフロントコントローラーによって実装されますが、それはすべて、サイトの実装方法とURLのルーティング方法によって異なります。)