
各顧客のユーザー リストを使用してプログラムで生成された .htaccess ファイルを使用して、静的レポートを含むアプリケーションのクライアントごとのサブディレクトリを制限しようとしていますが、.htaccess ファイルが解析されていることは実証できますが (ゴミが含まれている場合は 500 ISE、AllowOverride は機能しています)、より制限の厳しい Require ステートメントのいずれも、上位レベルの Location ディレクティブの Require valid-user をオーバーライドしていません。
例: /etc/httpd/conf.d/app.conf
<VirtualHost *:80>
ServerName app
RewriteEngine on
RewriteRule ^/cgi-bin\/api\/(\w+)$ /var/www/cgi-bin/App.cgi?mode=json&request=$1 [QSA,H=cgi-script]
<Directory "/var/www/cgi-bin/">
Options ExecCGI
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
AllowOverride FileInfo AuthConfig
Options +Indexes +FollowSymLinks -ExecCGI
IndexOptions +NameWidth=*
SetHandler default-handler
LogLevel trace8
</Directory>
<Location /cgi-bin/>
AuthType Basic
AuthName "App Server"
AuthUserFile /etc/httpd/conf.d/app.passwd
require valid-user
</Location>
<Location /cgi-bin/api/>
AuthType Basic
AuthName "App API"
AuthUserFile /etc/httpd/conf.d/app-api.passwd
Require valid-user
LogLevel trace8
</Location>
</VirtualHost>
/var/www/cgi-bin/api/reports/customer1/.htaccess
Require user CUSTOMER1
レポートディレクトリのLogLevel trace8をオンにして、
AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
AH01626: authorization result of Require valid-user : granted,
AH01626: authorization result of <RequireAny>: granted
Response sent with status 200
.htaccess ファイルに入れたものは何も参照されていないようで、Require ステートメントを RequireAll でラップしても何も起こらず、Require all denied を設定しても何も起こらず、Apache は .htaccess ディレクティブを、URI の (上位、左) 部分にある構成内の Location ディレクティブよりも具体的なものとして扱っていません。
編集済み: FileInfo を追加してみましたが効果はありませんでした。例をより完全なものに更新しました。設定場所 /cgi-bin/api/reports/customer1 Require user CUSTOMER1 は構成内で問題なく動作します。ジョブが実行されるたびに Web サーバーをリロードして .htaccess AuthZ ファイルを再構築する必要を回避しようとしただけです。一部のジョブは毎分実行されるため、理論上は .htaccess は特権リロードなしでアクセスごとに Apache に AuthZ の変更をチェックさせることができるはずなので、重要な AuthZ 変更がある場合にのみ httpd をリロードできる、より完全なツールを構築する手間をかけたくありませんでした。
答え1
最初の質問の後の回答
<Directory>
そして<Location>
指令は許可されません.htaccessファイル(参照コンテクストセクション)。
別途.htaccessファイル内の/foo/bar/レポート/Auth*
およびディレクティブを含むフォルダRequire
。.htpasswdファイルは有効です (絶対パスが優先されます)。
それでも動作しない場合は、AllowOverride
ディレクティブが正しく設定されている(つまり、<Directory>
指令)内の仮想ホスト/サーバー設定(.confファイル内のApache2 のフォルダ)。
質問の1回目の編集後の回答
あ.htaccessファイルは<Directory>
、.confファイル。現在、認証用のディレクティブ<Directory>
が混在しています。ディレクティブを<Location>
削除してください。<Location>
.confファイルを作成し、<Directory>
指示を次のように置き換えます。.htaccess変更されていないファイル:
<Directory "/var/www/cgi-bin/">
Options ExecCGI
AuthType Basic
AuthName "App Server"
AuthUserFile /etc/httpd/conf.d/app.passwd
require valid-user
</Directory>
<Directory "/var/www/cgi-bin/api/">
AuthType Basic
AuthName "App API"
AuthUserFile /etc/httpd/conf.d/app-api.passwd
Require valid-user
LogLevel trace8
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
AllowOverride FileInfo AuthConfig
Options +Indexes +FollowSymLinks -ExecCGI
IndexOptions +NameWidth=*
SetHandler default-handler
LogLevel trace8
</Directory>
あなたが質問を編集するまで、私は指令<Location>
が.htaccessファイルであり、実際のファイルシステムの場所ではなく仮想フォルダを指します。ただし、マニュアルには明確に記載されています:
ファイルシステム内のオブジェクトへのアクセスを制限する場合は、決して使用しないことが重要です
<Location>
。これは、多くの異なる Web スペースの場所 (URL) が同じファイルシステムの場所にマップされ、制限が回避される可能性があるためです。
答え2
あなたの 上書きを許可する 指令が不足しています。
文書に記載されている内容にもかかわらず、 ディレクティブが必要 次のようにコマンドを実行する必要があります。
AllowOverride FileInfo AuthConfig