web-dev-qa-db-ja.com

Apache:カスタム401エラーページを設定して元の動作を保存する方法

Apache/2.2.3(Linux/SUSE)でKerberosベースの認証を行っています。ユーザーがURLを開こうとすると、ブラウザはHTTP基本認証のようにドメインログインとパスワードについてユーザーに尋ねます。ユーザーがそのような要求を3回キャンセルすると、Apacheは401 Authorization Requiredエラーページを返します。私の現在の仮想ホスト構成は

    <Directory /home/user/www/current/public/>
            Options -MultiViews +FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
            AuthType Kerberos
            AuthName "Domain login"
            KrbAuthRealms DOMAIN.COM
            KrbMethodK5Passwd On
            Krb5KeyTab /etc/httpd/httpd.keytab
            require valid-user
    </Directory>

ユーザー向けの説明を含むNiceカスタム401エラーページを設定したいと思います。そして、私はそのような行を仮想ホスト構成に追加しました:

 ErrorDocument 401 /pages/401

ユーザーがApacheを承認できない場合は、ユーザーを私の素敵なページにリダイレクトします。ただし、Apacheは以前のようにユーザーのlogin\passwordを要求しません。この機能とニースエラーページを同時に欲しい!

正しく動作させることは可能ですか?

4
petRUShka

まず、使った時

ErrorDocument 401 /pages/401

/pages/401は動的なバックエンド生成コンテンツでした。単純な静的401.htmlを作成し、設定したとき

ErrorDocument 401 /401.html

システム全体が正常に動作を開始しました。したがって、解決策は次のとおりです。401エラーを表示するために動的ページを使用せず、静的htmlを使用します。

3
petRUShka

あなたが説明している振る舞いはクライアント側であり、Apache自体とは何の関係もありません。

実際に起こることは次のとおりです。

  1. ブラウザがリクエストを送信します
  2. Webサーバーは401で応答します
  3. ブラウザはユーザーに資格情報の入力を求めます
  4. ブラウザは資格情報を使用してリクエストを再送信します

アクセスが許可されている場合、Apacheは200で応答し、アクセスが許可されていない場合は、手順2に戻って続行します。何回試行するかは、ユーザーエージェント(つまり、ブラウザ)次第です。お使いのブラウザは明らかに3回の試行で停止します。その後、結果がキャッシュされたままになり、エラーページが表示されます。

ブラウザはこれらのタイプの操作の結果をキャッシュすることが多いため、これは正常です。再試行する前にブラウザを終了しましたか?これにより、キャッシュされた結果がクリアされます。

Apacheが「生の」動作をしている様子を正確に確認したい場合は、以下を使用してください。

認証されていないリクエスト:

_curl -D - http://yourserver/page.html
_

認証済み*リクエスト:

_curl -u user:pass -D - http://yourserver/page.html
_

Apacheが認証済みリクエストと未認証リクエストにどのように応答するかについては、出力の最上部にヘッダーが表示されます。 unauthの場合は401、authの場合は200が常に表示されます。そうでない場合は、正しく構成されていないか、何か他のことが起こっています。


* curlは_--negotiate_を渡すことでKerberos認証を行うことができますが、私はそれを行ったことがなく、試すための有効なテスト環境がありません。詳細については、curl(1)マニュアルをお読みください情報。

1
bahamat