PHPに関する質問です。


PHPから、header('HTTP/1.0 404 Not Found');でヘッダーを送った後、
「apache」の404エラーファイルを読み込みたいのですが、思うように出来ません。

以下のような方法でエラーページを表示させることは出来るのですが、、、
せっかくですので、apacheのエラーファイルのみで一括管理したく思います。

header('HTTP/1.0 404 Not Found');
include('404.php');
exit;

良い方法が御座いましたらご教授下さいm(__)m

▼以下、当方の環境です。
PHP5.2(apacheモジュールで動作)
apache2.2.4

回答の条件
  • 1人20回まで
  • 登録:2008/02/26 23:46:06
  • 終了:2008/03/04 23:50:03

回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/02/27 06:54:31

ポイント60pt

目的がよく分からないのですが、Apacheでエラー時表示ファイルを一元化したいのであれば、ErrorDocumentを使い、httpd.confまたは.htaccessに

ErrorDocument 404 [エラー時表示ファイル]

ように設定すればどうでしょうか。

http://httpd.apache.org/docs/2.2/ja/mod/core.html

http://nekhet.ddo.jp/item/787

id:uniuniko

ご回答ありがとう御座います。

具体的な目的ですが、簡単に説明させて頂きます。


以下のようなURLがあった場合で、

http://example.jp/index.php?p=1

引数「p=1」の時は正常にページが表示されるプログラムがあったとします。

それ以外の引数は存在しない処理(ページ)として処理したくて、

例えば、「p=2」の時は、404NotFoundにしたいのです。


また、実際に存在しない.phpファイル、例えば「aaaaa.php」へアクセスした場合、アパッチは正直に「404」を返します。

このような単純にファイルがあるかどうかの判定ですと、pahooさんが仰るような「httpd.conf内でエラードキュメントを指定」で問題ないかと思います。


しかし、実際に存在するファイルにアクセスした場合、基本的に結果は200を返します。

そこで、header関数で404を返すようにしたのですが、エラーページそのものは、また用意しなくてはならなく、なんとかアパッチの404を使いたいと思った次第です。


以上、説明が伝われば幸いです。

よろしくお願い致します。

2008/02/27 13:11:24
  • id:tezcello
    mod_rewrite が使えて、特定の引数の場合のみ、スクリプトに渡す(またはエラーを返す)なら、
    スクリプトで処理せずに、Apache側だけで処理できそうですけど?
  • id:uniuniko
    ご回答ありがとう御座います。


    実際に、mod_rewriteで色々と複雑な処理を多用しておりますが、
    その場合、許可する引数のみのパターンをmod_rewriteに記述する感じでしょうか?
    p=2だけを許可しない場合その方法も考えられますが、
    P=の後には、ユーザーの手打ち入力など、不特定多数の値が入力されることが予想されます。


    ▼現在のプログラムの流れを「簡単」に説明いたします。
    --------------------------------------------------------------
    (1)
    全てのリクエストを「index.php」で受付。

    (2)アクション
    index.php?p=1なら「1Action.php」をインクルード

    (3)ビュー
    続けて「1View.php」で実行結果を表示
    --------------------------------------------------------------

    というような流れになっています。


    この(2)のアクション処理でindex.php?p=2にアクセスされた場合、
    「2Action.php」は存在しないので、インクルードの処理でPHPのエラーとなります。
    このエラーをアパッチの404にしたいと思っております。
    現状ではphp内で分岐処理し、インクルード出来なかった場合は404のヘッダーを吐いて、404.phpを表示させています。

    もし良い方法が御座いましたら、ご教示くださいm(__)m
    ※ポイントも差し上げたいので出来れば通常の回答欄へお願い申し上げます。
  • id:tezcello
    フローからするとインクルードするファイルは有限個のようですが、
    > P=の後には、ユーザーの手打ち入力など、不特定多数の値が入力されることが予想されます。
    という事は、事前には分っていないって事でしょうか?

    既知であれば、それぞれのパターン(正規表現も使えるでしょうが)だけ記述するかなぁと思いました。

    自前のエラーページではなく既存のものをって事なら、Apache のページを指示するのは?
    うちのサーバは、/error/HTTP_NOT_FOUND.html.var がデフォルトらしいですけど。


    Location: /(自サイトの存在しないページ)
    で求める事は実現できるとは思いますがWebプログラムのあり方としては間違っていますねぇ。

    解決の方向に向わないつぶやきなので、コメントにて失礼します。
  • id:uniuniko
    度々すいません。ご回答ありがとう御座います。

    P=の後には、ユーザーの手打ち入力など...の件ですが、
    ファイル自体は有限個ですが、ユーザーの行動は制限出来ないので、
    事前にはそのユーザーの入力する値は解らず、正規表現でも完全に拒否出来ないような気がします。
    正規表現に関して初心者なので、なんとも言えませんが、、

    はい、ApacheのデフォルトエラーファイルはHTTP_NOT_FOUND.html.varになります。
    こちらを使用したいと思います。

    >>Location: /(自サイトの存在しないページ)
    はい、インクルード出来なかったら、あり得ないURLに飛ばし、無理矢理アパッチの404を使用するという方法ですね。私もこの方法は考えてみましたが、なんか無理矢理な感じがしますね^^;

    >>解決の方向に向わないつぶやきなので、コメントにて失礼します。
    いえいえ、参考ににりました。ありがとう御座いますm(__)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません