如果不满足某些条件,我想将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有自己的内置页面显示)。
答案 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 ...)在这方面是等效的。