为什么当我尝试获取服务器状态时会出现 404 Not Found?

为什么当我尝试获取服务器状态时会出现 404 Not Found?
<Location /status>
    SetHandler server-status
    order deny,allow
    allow from all
</Location>

但当我去拜访时http://ip:port/status

404 Not Found报告a ,为什么?

答案1

.htaccess当文档根目录中有一个文件并且该文件包含 时,也会发生这种情况RewriteRule,这在 CMS 漂亮的 URL 中很常见。

这种行为的解释如下。<Location>指令首先起作用,但此时不会调用处理程序。因此,RewriteRule设置处理程序(例如运行 PHP 脚本),因此SetHandler最终没有任何效果。

如果是这个原因,请找到RewriteRule导致问题的(*),并在其前面添加:

RewriteCond %{REQUEST_URI} !=/server-status

这会将server-statusURI 从 中排除RewriteRule,方式与排除现有静态文件的方式相同。当然,您用来代替 的内容/server-status必须与所选 完全匹配Location,在问题中, 是/status。(在 Apache 2.2.22 和 Apache 2.4 上测试)

server-status附录:还请注意,如果apache 进程根本无法读取,则您在尝试读取时会得到 403 错误DocumentRoot,这也是因为服务器状态处理程序没有机会工作。

附录 2:如果.htaccessApache 默认站点的 URL 经常被覆盖,并且 URL/server-status对于 Munin 等设备的工作是必需的,那么创建一个<VirtualHost 127.0.0.1:80>包含服务器状态处理程序的节可能是管理上最简单的。

附录 3(*):RewriteRule导致问题的 可能是与字符串 匹配的任何内容/server-status。这可能是可识别的,因为第一个参数将匹配任何内容,例如 开头的RewriteRule ..匹配任何字符,或^(.*),或者 以其他方式捕获 URI,例如.*\bstatus$。您还可以识别它,因为它故意排除带有 的现有文件!-f

例如,如果 WordPress 是主站点,并且您希望/server-status出现在其上,但由于某种原因,上述附录 2 不适用,则您可能需要插入以下额外内容RewriteCond

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/server-status
RewriteRule . /index.php [L]

然而,在任何情况下它可能都不会造成伤害RewriteRule

答案2

我的猜测是你没有加载状态模块 - 你能够确认吗?

答案3

因为您配置错误。您的日志对 404 的原因有何解释?我的第一个猜测是,这ip:port不是一个有效的虚拟主机(或者至少对于您放置的虚拟主机无效<Location /status>),并且它可能正在返回到默认虚拟主机。如果是这种情况,错误日志将提及您未配置的不合理路径。其他错误日志消息将意味着不同的事情,这就是为什么检查它们如此重要。

答案4

  • 您不需要配置目录或路径或索引文件
  • 您是否尝试使用其他端口?您不应该使用 80 端口

文档是:

<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
</Locaton>

您的位置不同,我认为这并不重要,但请尝试将您的位置作为/server-status,而不仅仅是/status。

但是 - 我认为 Spud 是对的。您尚未加载该模块。

-肖恩

相关内容