PAYATHON 2026

Wake-on-LAN 脚本执行成功后页面跳转到 404,如何解决?

数据阿明

通常需要修正 PHP 的重定向地址。当前的 Location:index.html 使用相对路径,如果 PHP 的访问地址是 /scripts/wol.php,浏览器会将它解析为 /scripts/index.html。如果首页实际位于 /index.html,请求就会指向错误的位置并出现 404。设备已经启动,可以将唤醒操作和随后的页面跳转分开检查。

为什么脚本成功后还会出现 404?

点击链接后,浏览器先访问 scripts/wol.php。PHP 调用 Python 脚本,然后通过 Location 响应头让浏览器再次导航。

假设 PHP 的地址是:

https://example.com/scripts/wol.php

当前响应头:

Location: index.html

会让浏览器访问:

https://example.com/scripts/index.html

这个路径由浏览器根据请求 URL 解析,与 Python 脚本在文件系统中的位置无关。实际目录和浏览器请求记录尚未提供,是否跳转到了该地址,需要在开发者工具中确认。

将重定向改为首页的实际 URL

如果首页位于站点根路径 /index.html,把原来的这一行:

header("Location:index.html");

改为:

header("Location: /index.html");
exit;

开头的 / 表示从当前站点的根路径开始。exit 用于结束 PHP 执行;header() 本身不会停止脚本。

如果应用部署在 /tools/ 等子路径,首页地址应相应写为:

header("Location: /tools/index.html");
exit;

这里应填写浏览器可以访问的 URL 路径,例如 /index.html,而不是 /var/www/html/index.html 这样的服务器文件系统路径。

检查 Python 输出是否影响响应头

system() 会直接输出被调用程序的标准输出。如果这些内容已经发送给浏览器,后续 header() 可能无法设置重定向,并出现 headers already sent 警告。这也值得检查,但不能仅凭现有代码认定它已经发生。

如果无需在页面中显示 Python 输出,可以用 exec() 收集输出并检查进程退出码。下面保留了原问题中的命令写法;使用时需将 [Variable1]、[Variable2] 替换为实际参数,并确认脚本文件名:

<?php
$output = [];
$exitCode = 0;

exec(
    "python /var/www/html/scripts/python/wake.py8 [Variable1] [Variable2]",
    $output,
    $exitCode
);

if ($exitCode !== 0) {
    http_response_code(500);
    exit('唤醒脚本执行失败,请检查服务器日志。');
}

header("Location: /index.html");
exit;

这段代码要求 PHP 环境允许调用 exec(),且文件开头没有 BOM、空白或其他提前输出。退出码只能帮助判断进程是否正常结束,不能证明目标设备已经开机。如果参数来自用户输入,还需要校验参数,并使用 escapeshellarg() 处理每一个传入 shell 的参数。

如何确认 404 出现在哪一步?

打开浏览器开发者工具的 Network 面板,启用保留日志,再点击一次唤醒链接,查看:

  1. wol.php 请求返回的状态码及 Location 响应头。
  2. 随后的页面请求实际访问了哪个 URL。
  3. 返回 404 的究竟是 wol.php,还是重定向后的页面。

如果重定向目标已经正确,但直接访问该 URL 仍然返回 404,再检查首页是否存在,以及 Apache 的文档根目录、Alias 或重写规则是否与这个 URL 对应。

HTML 和 Python 片段还需注意什么?

HTML 中的 <button> 内嵌套了 <a>,两者都是交互元素,不适合这样组合。当前操作是通过链接访问 PHP,可以直接保留链接,并补全表格单元格标签:

<tr>
  <td>
    <a href="scripts/wol.php">
      <img src="images/action_start.jpg" alt="Computer 2" style="width:50px;">
    </a>
  </td>
</tr>

这样可以改善标记结构,但要解决 404,仍需修正目标路径。

另外,贴出的 Python 代码中,if len(sys.argv) < 3: 下的两行没有缩进。如果实际文件也是这样,会产生缩进错误。既然描述中设备能够正常启动,应先核对是否只是粘贴时丢失了缩进。PHP 命令中的 wake.py8 也需要与实际文件名一致,不能仅凭这个名称断定它是错误。

备注:内容仅供参考。