2011-01-31 9 views
4

特定の条件が満たされていない場合は、PHPのスクリプト出力を実際の404ページ(Apache ErrorDocument指令で設定)にしたいと考えています。私はのErrorDocument価値を理解 PHPからアクセスするApacheのエラーコード指示文

if([email protected]$_SESSION['value']){ 
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); 
echo $default_page['404']; 
exit(); 
} 
echo 'Welcome to a secret place.'; 

を上書きすることができます..私は/それが可能だ場合はPHPからこの値にアクセスすることが可能かどうかはわかりませんが、私はでハードコード「デフォルト」値には特に興味がありますApache。それは(.htaccessファイルによって)overwittenされている値を知ることができるなら、それは:)ボーナスだ

http://httpd.apache.org/docs/2.0/mod/core.html#ErrorDocument

編集:明確にするために、私はコンテンツをデフォルトに送りたいですPHPのApacheの404ページ(または403など) headerのみを単独で使用すると、クライアント/ユーザーには何も出力されません(少なくともFF/Chromeでは、IEには表示されているページが組み込まれています)。

+0

「ErrorDocument」がまったく設定されていないと、デフォルトのページが表示されると思います。これが可能かどうかわからない –

+0

マリオとRoUSの両方に感謝します。両方の答えが正しいです。 HTTPライブラリが必要です..私は私の現在のホスティングに使っている '予算'ホスティングにこれらのライブラリをインストールすることは決してないので、残念です。 – aland

+1

もう一度チェックしてください。 'curl'はあなたのホストが使っているPHPのバージョンに組み込まれているかもしれません。 '<?php Header( 'Content-type:text/html');を含むファイル' ph​​pinfo.php'を作成してみてください。 phpinfo(); ?> 'をクリックし、そのページに移動してCurlがリストされているかどうかを確認します。 – RoUS

答えて

6

PHPからの応答コードを設定するための推奨方法は、次のとおりです。

Header('Status: 404 Not Found'); 

サーバーが通常404のために提供するページの本文を取得したい、とそうでない場合はこれの結果は(あなたが直接Locationヘッダフィールドをfrobbingしているとき、あなたは完全なURIを指定する必要があります。)

$uri_404 = 'http://' 
    . $_SERVER['HTTP_HOST'] 
    . ($_SERVER['HTTP_PORT'] ? (':' . $_SERVER['HTTP_PORT']) : '') 
    . '/was-nowhere-to-be-seen'; 
Header("Location: $uri"); 

:ユーザーのブラウザに書き換えなっURLを気に、あなたは次のようなものを使用することができますユーザーのブラウザがそのboguを指していることになりますあなたの望むものではないかもしれません。 (。おそらくないです)それでは、あなたはactuallページを自分のコンテンツを収集し、効果には、両者を組み合わせることができ:

Header('Status: 404 Not Found'); 

$uri_404 = 'http://' 
    . $_SERVER['HTTP_HOST'] 
    . ($_SERVER['HTTP_PORT'] ? (':' . $_SERVER['HTTP_PORT']) : '') 
    . '/was-nowhere-to-be-seen'; 
$curl_req = curl_init($uri); 
curl_setopt($curl_req, CURLOPT_MUTE, true); 
$body = curl_exec($curl_req); 
print $body; 
curl_close($curl_req); 

は、404ページの内容を取得する必要があり、偽のURIのサーバーレポートそれをコピーして自分で使用することができます。これにより、ハンドラの出力であるErrorDocument 404が正しく処理されます。

+0

ありがとう、これも動作します..私はCURLOPT_MUTE constをCURLOPT_RETURNTRANSFERに変更する必要があった – aland

0

あなたの例は良いようです。あなたはそれを行うには、PHPヘッダー機能を使用する必要があります。

<?php 
header("HTTP/1.0 404 Not Found"); 
?> 

このページは404であることを言っている、とあなたは、あなたが望むものに内容を記入できること

のようにリアルに404は404エラーコードをブラウザに送り返すだけのコードなので、ErrorDocumentまたはヘッダー(.. 404 ...)はこの点で同等です。

+1

これがどのように役立つかわかりません... – aland

3

デフォルト方法はありません。しかし、あなたは常に不正行為をすることができます:

header("Status: 404 Not There"); 

// no worky 
#readfile("http://$_SERVER[HTTP_HOST]/non-existant-url"); 

// doesn't work either (Apache detects the fraud) 
#virtual("/non-existant-url"); 

// otherwise a HTTP class, this one works but is seldomly available 
$request = new HttpRequest("http://localhost/error", 1); 
$answer = $request->send(); 
print $answer->getBody(); 

これはサブリクエストを引き起こします。ローカルサーバー上にあるので、私はより大きなパフォーマンスのペナルティを無視します。 しかし、Apache/mod_php virtual()関数を使って投資することは価値があるかもしれません。

特に、この方法は、404リソースの特定の場所を知ることに依存します。 URL書き換えは、場所にすでに存在する場合は、その後、別のトリックは、あなたの.htaccessに必要です:

RewriteRule ^non-existant-url$ error [E=404,L] 

これにより、デフォルトのErrorDocumentを利用可能にすること、期待される結果を生成するためのリソースを強制します。 @marioが提案されているよう

+0

これは唯一の方法だと思います。 –

+0

これは有望ですが、私はそれをすぐに動作させることができませんでした。午前中に再試行します。ありがとう:) – aland

+0

私はまだこれから多くの結果を得ることはできません。出力はありません – aland

関連する問題