不使用Apache的错误处理程序作为默认机制的原因?

时间:2011-07-31 23:02:12

标签: php web-applications web

每次请求进入时,典型的Web应用程序都会调用默认的单个服务器对象(例如PHP脚本)。如果Apache无法找到适用的脚本或资源,Apache会尝试提供错误页面。

或者,可以用这样的方式设计一个web-app, vHost的htdocs / root目录中没有脚本或资源。因此,每个请求都会强制Apache提供错误页面。

如果我们将服务器端脚本定义为标准错误处理程序,则任何URL都将触发该脚本。因此,单个脚本将是单一行动点。

有人知道原因,为什么这种做法是错误的?

3 个答案:

答案 0 :(得分:1)

我猜这是对网络服务器的惩罚。

每次请求资源时,它都会在文件系统中搜索文件,如果找不到,则会搜索并运行错误处理程序脚本。

如果由于某种原因PHP失败,您将不再获得任何错误页面,并且Apache将在错误处理程序中处理错误时记录类似于发生错误和另一个错误页面。

答案 1 :(得分:1)

你可以这样做,但你可能不得不跳过一些箍来获取原始URL,并避免发送HTTP错误代码。如果您的目标是将PHP用于所有请求,那么最好使用mod_rewrite

答案 2 :(得分:1)

似乎ErrorHandler语句调用的页面无法访问表单数据,如$ _GET,$ _POST,$ _REQUEST,$ _COOKIE(至少在我的Apache / PHP安装中)。

在敢于进入地狱之坑的旅程之后,我发现了这个地方,我最终逃脱了以下咒语,这似乎对我有用:

<Directory /same/as/document/root/>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /* index.php
</Directory>

第一行启用mod_rewrite。 第二行将重写基础设置为文档根,即,以便处理所有子目录的URL。 第三行设置条件,以便仅在请求的文件名(“%{REQUEST_FILENAME}”)不存在(“! - f”)时才激活规则。 第四行匹配以“/”开头的所有路径,并将它们重定向到index.php。

免责声明:我对Perl正则表达式和Apache mod_rewrite都非常非常了解。

请注意,用户可以输入以下格式的URL路径:

 /some_directory/ or /some_directory

因此您可能需要处理这两种情况。