Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP访问apache errordocument指令_Php_Apache - Fatal编程技术网

从PHP访问apache errordocument指令

从PHP访问apache errordocument指令,php,apache,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.'; 我知道ErrorDocume

如果不满足某些条件,我想将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硬编码的“默认”值特别感兴趣。如果可以知道覆盖的值(例如通过.htaccess文件),那么这是一个额外的好处:)


编辑:为了清楚起见,我想从PHP将内容发送到Apache的默认404页面(或403等)。如果我只单独使用
标题
,则不会向客户机/用户输出任何内容(至少在FF/Chrome中,IE有自己的内置页面显示)

你的例子似乎不错。您需要使用php header函数来执行此操作:

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

就像你说的,这个页面是404,然后你可以用你想要的内容来填充


真正的404只是将404错误代码发送回浏览器的任何代码,因此ErrorDocument或header(…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函数可能值得研究

值得注意的是,该方法依赖于知道404资源的特定位置。如果已经有url重写,那么在.htaccess中需要另一个技巧:

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

这将强制资源生成预期的结果,从而使默认的errordocument可用。

从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");
(当您直接跳转
位置
标题字段时,您需要提供完整的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);

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

我认为当根本没有设置
ErrorDocument
时,会显示默认页面。不确定这是否可能多亏了马里奥和罗斯,两个答案都是正确的。HTTP库是必需的。。这是一个遗憾,因为我永远不会让这些库安装在我目前使用的“预算”主机上,哦,好吧,一个有趣的实验
curl
可能已经内置到主机使用的PHP版本中。尝试创建一个只包含
的文件
phpinfo.php
,然后导航到该页面,查看是否列出了Curl。我认为这是唯一的方法。这看起来很有希望,尽管我无法立即让它工作。我会在早上再试一次,谢谢:)我仍然没有从中得到多少结果,没有output@aland:明显的疏忽。PHPs readfile()和流包装器在遇到HTTP错误时不返回任何内容。因此,您需要使用HTTP库来实现这一点。或者
virtual()
在您的服务器上可用吗?@aland:不,那么这实际上是一个结论。然后,作为最后的手段,您必须使用其中一个HTTP库(或例如),甚至可能是curl。我已经尝试过PHPs HttpRequest,它可以很好地完成这项任务,但是它在大多数服务器上都不可用。谢谢,这也可以。。我只需将CURLOPT_MUTE const更改为CURLOPT_RETURNTRANSFER