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

lin*_*nux 8 apache-2.2

<Location /status>
    SetHandler server-status
    order deny,allow
    allow from all
</Location>
Run Code Online (Sandbox Code Playgroud)

但是当我访问时http://ip:port/status

a404 Not Found被举报了,为什么?

Ced*_*ght 19

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

这种行为的解释如下。该<Location>指令首先采取行动,但该处理器没有在这个阶段叫。然后RewriteRule设置一个处理程序,例如运行一个 PHP 脚本,所以SetHandler最终没有任何影响。

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

RewriteCond %{REQUEST_URI} !=/server-status
Run Code Online (Sandbox Code Playgroud)

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

附录:还要注意,server-status如果DocumentRootapache 进程根本无法读取它,您可能会尝试读取 403 ,这也是因为服务器状态处理程序没有机会工作。

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

附录 3(*):RewriteRule导致问题的可能是与 string 匹配的任何内容/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]
Run Code Online (Sandbox Code Playgroud)

但是,在任何RewriteRule.


wom*_*ble 3

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

  • 至少,它会告诉你哪个文件不存在。 (3认同)
  • 当然是这样,这就是为什么你得到 404。但是它还说了什么*其他*? (2认同)