【问题标题】:Determining if a html request comes from inside the office using PHP使用 PHP 确定 html 请求是否来自办公室内部
【发布时间】:2012-07-25 14:58:20
【问题描述】:

我想知道某个服务器设置。

假设我有一个在本地网络上运行的 Web 服务器,可以使用诸如 www.example.com 之类的 URL 从网络内部和外部访问它。

我希望我的 PHP 网站能够确定请求是来自内部 LAN 还是来自外部。我怀疑使用 IP 地址是否有可能,因为请求看起来好像来自公共 IP 地址,而不是内部 IP 地址 192.168.x.x。此外,公共 IP 可能会不时更改。

这可能吗,我如何在 PHP 中实现这一点?

【问题讨论】:

  • 如果服务器在网络内部,来自网络内部的任何请求都将来自 LAN IP 地址。只需尝试回显$_SERVER['REMOTE_ADDR'],您就会看到。
  • @dave:不一定。如果 example.com 解析为外部 IP,则内部请求可能会从前门往返并显示为“外部”,无论如何。
  • 这个问题与 PHP 无关——这将是一个实现细节。据我了解,OP 询问如何在不使用 IP 的情况下识别客户端。对吗?
  • @MarcB(该死,你对我的评论编辑来说太快了)......在这种情况下,所有内部请求似乎都来自你自己的公共 IP - 所以如果你试图是确定内部还是外部,您可以放心使用它。当然,如果你想确定哪个 LAN 客户端是源,你就有点卡住了。如果您使用的是 Windows 域,虽然您可以强制 LAN 客户端使用 IE 并使用 NTLM 身份验证,但这很讨厌。
  • @MichaelFrey $host = explode(':', $_SERVER['HTTP_HOST']); if ($_SERVER['REMOTE_ADDR'] == gethostbyname($host[0])) { echo 'Internal'; } else { echo 'External'; } - 有效,我刚刚测试过。 explode() 之所以存在,是因为 $_SERVER['HTTP_HOST'] 还可能包含一个端口号,这会破坏 DNS 查找。

标签: php webserver httprequest


【解决方案1】:

如果您的请求来自局域网内部,则 $_SERVER['REMOTE_ADDR'] 将来自私有 IP 地址组,如果来自局域网外部则不会。 除非您的内部网络配置不当,否则情况可能并非如此。

在此处查找正确的地址组 http://en.wikipedia.org/wiki/Private_network

如果您的内部 dns 服务器将 example.com 解析为公共 ip,那么请求似乎也来自公共 ip,因此如果是这种情况,您也知道请求来自内部。

【讨论】:

  • 因此,由于整个网络只有一个公共 IP 地址,我可以将请求 IP 与服务器公共 IP 进行比较。但是如何查看服务器的公网 IP 地址呢?
  • 以太硬编码或使用php.net/manual/en/function.gethostbyname.php,可能与主机头结合
【解决方案2】:

只要您知道您办公室的外部 NAT IP 范围,您应该能够通过访问 $_SERVER['REMOTE_ADDR'] 值轻松做到这一点。

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多