2017-02-01 14 views
3

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に要求を出します。

ここで起こっていただきました!誰もがアイデアを持っています!?...

+0

ロギング%{REQUEST_URI} eは、それが発現の%と同じソース{REQUEST_URI}から読み出していない誤解されています。前者は、httpdがデータを環境変数にコピーするのに十分遠くにあることを要求しています。 – covener

+0

今日は後で見ていきますが、mod_log_debugがもっと役立ちます。値の引数として式を取り、さまざまな段階で値を表示できます。 おそらく、いくつかのモジュールが途中でr-> uriを変更しており、これはヒントを与えるでしょう。 – covener

+0

ok、もう一度mod_log_debugをチェックします... – lsblsb

答えて

0

代わりの場所を使用して、あなたは別のディレクトリを使用することができます。

<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> 
    **<Directory "/var/www/domain.name/docs/"> 
     AuthType None 
     Require all granted 
    </Directory>** 
    CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%{REQUEST_URI}e" 
</VirtualHost> 

.htaccessを使用して同じことができます。関連する質問に回答しましたHow to remove .htaccess password protection from a subdirectory

+0

私は知っています。私もディレクトリを介して試しました。しかし、それは動作しませんでした - 少なくとも.htaccessファイルなしで(私はこの場合に使用したくない)。しかし、多分私はもう一度試してみるべきです。しかし、それは単なる回避策であり、問​​題を解決しません。 – lsblsb

1

私は最終的に自分で回避策を見つけました。バージョンAを使用しますが、REQUEST_URIの代わりに環境変数THE_REQUESTを使用します)。幸いにもそれは動作します!

Aの調整されたバージョン) - のみGET要求に対して:

<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 %{THE_REQUEST} =~ m#GET\s+\/docs\/[^\/]+\s+HTTP# 
    Require valid-user 
</RequireAny> 

Options +ExecCGI +FollowSymLinks 
AllowOverride All 

</Directory> 

</VirtualHost> 
+0

私は問題が何とかmod_rewriteに関係していると思います.. REQUEST_URIは、マッチングが起こったときに変更されたようです。 – staabm

関連する問題