一般に、ドキュメントルート内から保護されたファイルを提供することは好ましくありません。特に、ユーザーがログインしてアクセスする必要があるとき。サービスをWebサーバーに委任すると、ユーザーがログインしているかどうかをプログラムで確認する能力が失われます。これは、Apache WebサーバーがユーザーがPHPアプリケーション内で認証されているかどうかを知る手段がないためです。ユーザーがファイルURLを知ると、システムにログインせずにファイルにアクセスできます。
解決方法があります。しかし、Webルートの外部にファイルを置いて、アクセスしたときにファイルを配布するスクリプトを開発することを強くお勧めします。この方法で、ファイルを処理するときに、認証された、認可されたセッションを確認できます。
ただし、この方法をお勧めする場合は、回避策があります。のは、サンプルのディレクトリ構造をレイアウトしてみましょう:
/path/to/web/document/root
├── manual
│ └── .htaccess
│ └── file1.pdf # protected
│ └── file2.pdf # protected
│ └── file3.epub # protected
├── documentation.php
├── listing.php # protected
└── .htaccess
ユーザーがログインしているときは、manual/
ディレクトリ内のファイルを保護したいとアクセスのみ。だから、あなたはあなたのmanual/.htaccess
ファイルに以下のディレクティブを置く:
RewriteEngine on
RewriteRule^/documentation.php [R]
# Your own rewrite rule has a syntax error and
# causes a 500 internal error
はこの親ディレクトリ内のファイルdocumentation.php
にすべての要求をリダイレクトします。外部リダイレクトが必要ない場合は、R
フラグを削除してください。
あなたが言ったように、今問題はmanual/
の中のファイルへのリクエストがドキュメントファイルにリダイレクトされてしまうことです。
回避策は、ヘッダーを確認し、要求がlisting.php
ファイルからのものであることを確認することです。
RewriteEngine on
# Feel free to change example.com with your own domain
RewriteCond %{HTTP_REFERER} !^http://www.example.com/listing.php$
RewriteRule^/documentation.php [R]
manual/file2.pdf
への直接の要求はdocumentation.php
へのリダイレクトになりますが、ユーザがlisting.php
のリンクをクリックすると、彼女は問題なくファイルにアクセスすることができますこの方法。
あなたはリファラ条件は、より汎用的にする必要がある場合は、こちらの記事を参照してください。
Referrer Checking with .htaccess
はthat a user can easily spoof the HTTP_REFERER
headerを警告し、したがって、ログインが必要なく、ファイルにアクセスすること。これを実装する唯一の本当の弾丸ではない方法は、私がこの記事の冒頭で言ったことです。
manual/
ディレクトリは、基本的なhttp認証を使用して保護することもできます。しかし、この方法では、ユーザはそのフォルダにアクセスするために別のユーザ名/パスワードの組み合わせを入力する必要があります。
htaccessを削除するとphpの一覧が表示されますか?私はそうは思わない。 – sepehr
はい。なぜあなたはそれをどう思いましたか? –
ウェブサーバが500の内部エラーを投げたとしても、 'opendir'はディレクトリを開きます。エラーログを確認しましたか? – sepehr