从PHP访问Apache的errordocument指令

我想做一个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 …)在这方面是等价的。