web-dev-qa-db-ja.com

ヘッダーの操作に関するApacheの動作の説明を探しています

ServerFaultで回答を得ようとしました-彼らは知りません、本当の教祖はすべてここに座っています。

問題の背景:Googlebotは存在しないURLを作成し、それらをクロールしようとします。一部のURLでは、Apacheは404を(正しく)起動し、別のURLでは403(間違った)を起動します。 Apacheが403を起動するRegExでURLをキャッチできないため、404を強制するように適切に書き換えることができません。

403ではなく404を強制する次の回避策を作成しました。

私はhtaccessに追加します

ErrorDocument 403 /404.php
ErrorDocument 404 /404.php

どちらの場合も同じファイル。

そして、正しいヘッダーを強制するために、最初に404.phpに追加します。<?php http_response_code(404); ?>この方法で、Apacheが403で応答しようとするGooglebot 404を表示します。

question is:誰かが私に説明できますか、この回避策が実際にどのように詳細に機能するか?この方法でヘッダーを操作するにはどうすればよいですか?私はいつも、Apacheがどの応答コードを提供するかを決定し、beforehtaccessを調べると思いました...

5
Evgeniy

この回避策の実際の仕組み

PHPはリクエストの後半で実行されるため、ほとんどの場合 ApacheがすでにPHPコードに設定しているヘッダーをオーバーライドできます。それはほとんどそれです。

(それ以外に、この方法で404ハンドラーを介して403を送信すると、必要な場合、Apache config/.htaccessから実際の403をトリガーすることは明らかに難しくなります。)

ほとんどの時間

ただし、重大なエラー(動作していない通常)がある場合、サーバーは500 Internal Server Errorで応答する可能性があります。これは、独自のコードでトラップできない場合があります。

また、デフォルトでは、Apacheはエンコードスラッシュ(%2F)を含むリクエストに対して(システムで生成された)404を返すように設定されています。

Apacheが引き継ぐ他の状況(mod_securityなど)がありますが、そうでなければ、物事が正常に実行されている場合、応答ヘッダー全体を操作できるはずです。

Htaccessを調べる前に、Apacheがどの応答コードを提供するかを常に決定していると思いました...

ありますが、.htaccessのコードはこれを上書きします。 (これを妨げるサーバー構成に制限はありません。)

Googlebotは存在しないURLを作成し、それらをクロールしようとします。

多くの人がこの振る舞いを見ています。ただし、GooglebotがこれらのURLをどこからともなく「作成」しているとは思いません。これらのURLが見つかっている可能性が高いどこか。 (または、実際のGooglebotではありません。)

一部のURLでは、Apacheは404を(正しく)起動し、別のURLでは403(間違った)を起動します。 Apacheが403を起動するRegExでURLをキャッチできないため、404を強制するように適切に書き換えることができません。

Apache(mod_dir)は、インデックスドキュメントを含まず、サーバー生成のディレクトリインデックスが禁止されているディレクトリを要求すると、403をトリガーします(したがって、「403 Forbidden」応答)。 mod_dirは、末尾にスラッシュを追加することでこれらのURLを「修正」しようとします(省略した場合)-patternに末尾のスラッシュを含めない限り、URLに一致することはできません(mod_dirは早く起動します) 。したがって、これはmod_dirの問題のように聞こえます。ただし、これを確認するには、問題のURLを確認する必要があります(おそらく、サーバーのconfig/.htaccessファイルについてさらに質問する必要があります)。

何か他のものが存在しない限り、これらのURLをトラップ/リライトできるはずです。すべての403を404に変更することは、特に望ましい回避策ではありません。

4
MrWhite