从PHP访问apache errordocument指令

时间:2011-01-31 21:38:17

标签: php apache

如果不满足某些条件,我想将php脚本输出像真正的404页面(在Apache ErrorDocument指令中设置)。我不知道我怎么能/如果可以从PHP访问这个值..

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

我理解ErrorDocument值可以被覆盖,但我对Apache硬编码的'default'值特别感兴趣。如果可以知道被覆盖的值(例如通过.htaccess文件),那么这就是奖励:)

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

编辑:要清楚,我想从PHP发送内容默认的404页面(或403等)。如果我自己只使用header,则不会向客户端/用户输出任何内容(至少在FF / Chrome中,IE有自己的内置页面显示)。

3 个答案:

答案 0 :(得分:6)

从PHP设置响应代码的推荐方法是@mario建议:

Header('Status: 404 Not Found');

如果你想获得服务器通常会提供404的页面正文,而不关心在用户的浏览器中重写的URL,你可以使用类似的东西:

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

(当你直接擦除Location标题字段时,你需要提供一个完整的URI。)结果是用户的浏览器最终会指向那个虚假的位置,这可能不是你想要什么。 (可能不是。)那么你可以自己收集页面的内容并将两者结合起来,实际上:

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);

这应该获取服务器为虚假URI报告的404页面的内容,然后您可以复制它并自己使用它。这应该正确处理任何ErrorDocument 404处理程序输出。

答案 1 :(得分: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可用。

答案 2 :(得分:0)

你的榜样似乎很好。您需要使用php标头函数来执行此操作:

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

就像那样你说这个页面是404,然后你可以用你想要的东西填写内容

真正的404就是将404错误代码发送回浏览器的任何代码片段,因此ErrorDocument或header(... 404 ...)在这方面是等效的。