<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-status
URI 从 中排除RewriteRule
,方式与排除现有静态文件的方式相同。当然,您用来代替 的内容/server-status
必须与所选 完全匹配Location
,在问题中, 是/status
。(在 Apache 2.2.22 和 Apache 2.4 上测试)
server-status
附录:还请注意,如果apache 进程根本无法读取,则您在尝试读取时会得到 403 错误DocumentRoot
,这也是因为服务器状态处理程序没有机会工作。
附录 2:如果.htaccess
Apache 默认站点的 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 是对的。您尚未加载该模块。
-肖恩