QA@IT

Apache2におけるhtaccessの設定方法について

5505 PV

最近Apache2をインストールして、複数人数が利用できるWebサーバを構築している者です。

  • OSはRaspberry Pi B+にインストールしたRaspbian
  • ApacheのバージョンはApache2.4.17
  • インストール方法はソースを自分でコンパイル
  • prefixはadminのホームにあるApache2フォルダを指定(${SERVER_ROOT})

やりたいことは、各ユーザのホームディレクトリにあるpublic_htmlを公開し、それぞれのユーザがpublic_html/private/.htaccessの中で独自のアクセスルールを設定し、private以下のサブディレクトリで独自のアクセス方法を実現したい。ただし、OptionsはLimitとIndexesに限定します。

試しに、${SERVER_ROOT}/conf/extra/httpd-userdir.confと~hoge01/public_html/private/.htaccessにおける設定は以下のようにしました。

#httpd-userdir.confの設定方法
<Directory "/home/*/public_html">
    Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
    AllowOverride Limit Indexes
    Require method GET POST OPTIONS
</Directory>
#.htaccessの設定方法
#外部に公開しない、内部のみ接続
<Limit GET POST OPTIONS>
        Require ip 192.168.1.0/255.255.255.0
</Limit>
<LimitExcept GET POST OPTIONS>
        Require all denied
</LimitExcept>
Options Indexes

しかし、以上の設定でウェブから~hoge01/public_html/private/testに接続するとエラーが起きます。${SERVER_ROOT}/logsにあるaccess_logとerror_logを確認したところ、以下のようになりました。

#access_logの出力
192.168.1.5 - - [24/Nov/2015:02:13:55 +0900] "GET /~hoge01/private/test/ HTTP/1.1" 500 532
192.168.1.5 - - [24/Nov/2015:02:13:55 +0900] "GET /~hoge01/private/test/ HTTP/1.1" 500 532
192.168.1.5 - - [24/Nov/2015:02:13:55 +0900] "GET /~hoge01/private/test/ HTTP/1.1" 500 532
#error_logの出力
[Tue Nov 24 02:13:55.777247 2015] [core:alert] [pid 20450:tid 2969564256] [client 192.168.1.5:16567] /home2/hoge01/public_html/private/.htaccess: Require not allowed here
[Tue Nov 24 02:13:55.917311 2015] [core:alert] [pid 20451:tid 2994730080] [client 192.168.1.5:16568] /home2/hoge01/public_html/private/.htaccess: Require not allowed here
[Tue Nov 24 02:13:56.073389 2015] [core:alert] [pid 20450:tid 2961175648] [client 192.168.1.5:16569] /home2/hoge01/public_html/private/.htaccess: Require not allowed here

Apache2のステータスコードは500でよくあるInternal Server Errorだが、どこをどう直したらいいのかわかりません。試しに、AllowOverideを以下のように変えてみたが、AllとNoneの場合はうまくできるようだが、AllowOverideで機能を限定して使う方法はうまくできなかった。

  1. All - .htaccessは書かれた通りに機能して外部アクセス遮断し、ファイルの一覧も表示される。
  2. None - .htaccessは無視された状態で特に問題なかった。
  3. Limit - Internal Server Error (status 500)
  4. Indexes - Internal Server Error (status 500)
  5. Limit Indexes - Internal Server Error (status 500) 複数の人数で使うサーバの安全を考慮して、AllOverrideはAllでなく、機能を限定して使いたいですが、どうしたらよいでしょうか?以上長くなってすみません。よろしくお願いします。

回答

AllowOverrideAuthConfigがないからではないでしょうか。

https://httpd.apache.org/docs/trunk/ja/mod/core.html#allowoverride

構文: AllowOverride All|None|directive-type [directive-type] ...

directive-type には、以下のディレクティブ群の キーワードのどれかを指定します。

AuthConfig
認証に関するディレクティブの使用を許可する (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require など)。

エラーの話からはずれますが、<LIMIT>はHTTP Methodに対する規制が主な役割であり、アクセス制御に使うには適していません。

https://httpd.apache.org/docs/trunk/ja/mod/core.html#limit

アクセス制御は、通常全てのアクセスメソッドに対して 影響し、普通はこれが望ましい挙動です。 そうしたことから、大部分の場合にはアクセス制御に関わるディレクティブを <Limit> セクション内に 書くべきではありません。

試してはいないのでただの勘ですが、一部からのアクセスに制限したいだけであれば、各ユーザーの.htaccessRequire ipだけで良いように思います。
サーバー全体でメソッドを制限したいならhttpd-userdir.confDirectoryディレクティブで<LimitExcept>だけ指定してLimitExceptは上書きできないようにすれば良いような気がします。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。