我想做一个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发送到Apache的默认404页(或403等)。 如果我只使用header
自己没有输出到客户端/用户(至less在FF /铬,IE有自己的内置页面显示)。
推荐的方式来设置来自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
处理程序输出。
没有默认的方法。 但是你总是可以作弊:
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可用。
你的例子看起来不错。 你需要使用php头功能来做到这一点:
<?php header("HTTP/1.0 404 Not Found"); ?>
就像你说的这个页面是一个404,然后你可以用你想要的内容填写内容
一个真正的404只是任何发送一个404错误代码回浏览器的代码,所以ErrorDocument或头(404 …)在这方面是等价的。