【问题标题】:php ip address redirectphp ip地址重定向
【发布时间】:2014-06-17 15:49:59
【问题描述】:

我有一个 php 脚本,它会更改 /etc/network/interfaces 文件中的 IP 地址。

编辑完文件后,我使用exec("sudo ifdown eth0)exec(sudo ifup eth0)刷新配置。 它可以工作,但需要将近 40 秒。

我想将用户重定向到新的 IP 地址,方法是:

header("Location: http://$ip/?page=networkSettings");

只有当我注释掉 exec 调用时,重定向本身才有效。 (自然我得到“无法连接错误”)

否则网页浏览器会显示: 等待 192.168.0.50

我使用了php的睡眠功能,但是没有效果。

有人知道如何解决这个问题吗?

【问题讨论】:

  • sleep 会让事情变得更糟,不是吗?浏览器似乎正在等待脚本完成。

标签: php linux networking redirect


【解决方案1】:

您需要使用其他方法来发出重定向。由于脚本运行时服务器的 IP 地址发生变化,这会导致连接中断——客户端永远不会收到 Location 标头。

我见过很多嵌入式设备使用的一种方法是延迟重定向。让您的页面显示一个带有meta refresh 到新地址的结果页面,然后更改机器的 IP。设置刷新超时,以便在超时到期并且客户端重定向到新 IP 时,计算机应该有新 IP 并正常工作。

【讨论】:

  • 结果页面可能会警告他们不要过早尝试新地址。
【解决方案2】:

您的exec() 调用缺少引号,导致致命错误。

【讨论】:

    【解决方案3】:

    考虑一下你在做什么:你关闭网络接口,用一个新的 IP 重新启动它,然后尝试向客户端发送重定向。但是到那时,您在一个新 IP 上,客户端将拒绝来自该新 IP 的数据包,因为它只期望来自 旧 IP 的响应。

    你的序列应该更像:

    header("Location: $newip");
    flush(); // try and send the header BEFORE you take down the network
    exec('take down network');
    exec('bring up network');
    

    即使这样也可能不完全可靠,因为 PHP 只能向网络服务器建议应该刷新输出缓冲区。您实际上可能在刷新完成之前执行了网络删除,然后您仍然在同一条船上:重定向在新 IP 上发出并被客户端拒绝。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 2018-11-01
      • 2020-04-07
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多