web-dev-qa-db-ja.com

htaccessで保護されたディレクトリ内の1つのフォルダを除外する

Htaccessで保護されたディレクトリがあります。これが私が今使っているコードです:

AuthName "Test Area"
Require valid-user
AuthUserFile "/***/.htpasswd"
AuthType basic

これは正常に動作しています。しかし、私はこのフォルダ内に誰でもアクセスできるようにしたいディレクトリがありますが、その方法はわかりません。

保護されたディレクトリの外にファイルを移動することは可能ですが、簡単に言うと、フォルダーは保護されたフォルダー内にとどまる必要がありますが、すべてのユーザーがアクセスできる必要があります。

フォルダーへのアクセスを制限しながら、サブフォルダーへのアクセスを許可するにはどうすればよいですか?

24
Sherwin Flight

この記事 によると、SetEnvIfを使用してこれを実現できます。グランドアクセスする各フォルダーとファイルを一致させ、それらに環境変数 'allow'を定義します。次に、この環境変数が存在する場合にアクセスを許可する条件を追加します。

.htaccessに次のディレクティブを追加する必要があります。

SetEnvIf Request_URI "(path/to/directory/)$" allow
SetEnvIf Request_URI "(path/to/file\.php)$"  allow
Order allow,deny
Allow from env=allow
Satisfy any
16

次の内容の.htaccessファイルをサブディレクトリに作成するだけです。

Satisfy any

42
user3201334

受け入れられた回答は、新しいApacheバージョンではうまく動作しないようです。これは、Apache Updatesが一部の顧客サーバーにロールアウトされるとすぐに機能しなくなったためです。

次のアプローチをお勧めします。

AuthType Basic
AuthName "NO PUBLIC ACCESS"
AuthUserFile /xxx/.htpasswd

SetEnvIf REQUEST_URI "(path/to/directory/)$" ALLOW

<RequireAny>
  Require env ALLOW
  Require valid-user
</RequireAny>
7
sebastian

コメントを追加するのに十分な評判はありませんが、次の2つの回答はパターンを使用しています。

SetEnvIf Request_URI "(path/to/directory/)$" allow

環境変数を設定し、それが存在するかどうかを確認します。引用符の部分は正規表現です。このステートメントは、「path/to/directory /」で終わるすべてのパスが一致し、「path/to/directory/index.html」ではなく、「administrationpath/to/directory /」などの変数を設定する必要があることを示しています。 「$」は文字列の末尾と一致します。

より良い一致は次のようになります:

_SetEnvIf Request_URI "^/path/to/directory/" allow_

つまり、URIパスは "/ path/to/directory /"(キャレットは文字列の先頭と一致)で始まる必要がありますが、末尾のスラッシュの後に追加のコンテンツを含めることができます。これには末尾のスラッシュが必要です。オプションにするために、2つのルールを追加できます。

_SetEnvIf Request_URI "^/path/to/directory$" allow
SetEnvIf Request_URI "^/path/to/directory/" allow
_

または、より多くのパターンマッチングを使用します。

SetEnvIf Request_URI "^/path/to/directory(/.*)?$" allow

括弧と疑問符はオプションのグループを作成し、「。*」は0個以上の文字を意味します。

個人的には、サブフォルダーの.htaccessで_require all granted_ 1 を使用するか、次のようにします。

require expr "%{REQUEST_URI} =~ m|^/path/to/directory(/.*)?$|"2 親の中で。

1
melds