DebianサーバでApache 2.4.10を使用しています。リクエストは、バランサーとして機能するApache Proxy Server(同じシステムとバージョン)からリダイレクトされます(現時点では1つのバランスメンバーのみ)。Apache 2.4:AuthType BasicとREQUEST_URI - 比較が正常に機能しない
関連する単一仮想ホストへのアクセスは、一般にAuthType Basicによって制限されます。パブリック文書を含む1つのフォルダには、認証なしでアクセスできる必要があります。
これを達成するために複数の方法(新しいApache 2.4の構文)をテストしましたが、どの方法を試しても問題はありませんでした。正規表現。比較が行われたときにREQUEST_URIに無効な値があるように見えます。
私はi.aを試しました。次の選択肢:
A)
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
AuthType Basic
AuthName "Restricted"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require expr %{REQUEST_URI} =~ m#^/docs#
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%{REQUEST_URI}e"
</VirtualHost>
B)
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
AuthType Basic
AuthName "Restricted"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
<LocationMatch "^/docs">
AuthType None
Require all granted
</LocationMatch>
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%{REQUEST_URI}e"
</VirtualHost>
C)
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
SetEnvIf Request_URI /docs noAuth=1
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require env noauth
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%{REQUEST_URI}e"
</VirtualHost>
すべての選択肢は、同じ問題で立ち往生しているようです。 REQUEST_URIとの比較が失敗するか、正常に動作しません。
例:私は
Require expr %{REQUEST_URI} =~ m#^/[a-z]#
(テストなど)を実施例Aのライン16を変更すると、それは(資格情報なしで許可されたアクセス)が働きます。
[a-z]
をたとえばに変更します。 [d-i]
、それでも動作しますが、私が[a-z]
に変更すると、 [d-g]
、それはもはや動かず、ユーザー/パスのダイアログが現れます。
例BのLocationMatchディレクティブの正規表現を変更すると、まったく同じ動作が表示されます。
別のヒント:<Location /docs>
代わりに<LocationMatch...
を使用
(実施例B参照)も動作しません。しかし、<Location />
が動作します。
そして:
ログ出力が常に同じである:アクセス資格情報なしREQUEST_URIの値は、要求されたURL(例えば/ドキュメント)のパスの一部と同じで付与され
。
しかし、ユーザ/パスダイアログが表示された場合、値はダッシュ( " - ")です。これは、Apacheが空または使用できない値に使用するデフォルト値のようです。
そして:私は、例えば使用する場合
問題は、私は(プロキシなし)に直接サーバーにアクセスしても、持続しますかんwget:サーバー上のlocalhostに要求を出します。
ここで起こっていただきました!誰もがアイデアを持っています!?...
ロギング%{REQUEST_URI} eは、それが発現の%と同じソース{REQUEST_URI}から読み出していない誤解されています。前者は、httpdがデータを環境変数にコピーするのに十分遠くにあることを要求しています。 – covener
今日は後で見ていきますが、mod_log_debugがもっと役立ちます。値の引数として式を取り、さまざまな段階で値を表示できます。 おそらく、いくつかのモジュールが途中でr-> uriを変更しており、これはヒントを与えるでしょう。 – covener
ok、もう一度mod_log_debugをチェックします... – lsblsb