【问题标题】:Reasons not use Apache's error handler as a default mechanism?为什么不使用 Apache 的错误处理程序作为默认机制?
【发布时间】:2011-07-31 23:02:11
【问题描述】:

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

或者,可以设计一个网络应用程序,即 vHost 的 htdocs/root 目录中不存在脚本或资源。因此,每个请求都会强制 Apache 提供一个错误页面。

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

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

【问题讨论】:

  • 关闭?这里有什么问题?这个问题是技术问题。不是吗?
  • 我想这是一个最佳实践问题。我喜欢它。

标签: php web-applications web


【解决方案1】:

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

在冒险进入 Apache mod_rewrite 的地狱深渊之后,我最终逃脱了以下咒语,这似乎对我有用:

<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

所以你可能必须同时处理这两种情况。

【讨论】:

    【解决方案2】:

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

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

    如果由于某种原因 PHP 失败了,您将不会再看到任何错误页面,Apache 将在错误处理程序中处理错误时记录发生错误和另一个错误。

    【讨论】:

    • 查找文件是否存在并加载默认对象(可能已缓存)比加载不同但现有的文件更快。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2016-09-02
      相关资源
      最近更新 更多