【问题标题】:How do I determine if the client is accessing the website through intranet or internet?如何确定客户是通过内网还是互联网访问网站?
【发布时间】:2014-05-18 04:34:02
【问题描述】:

情况是我在 IIS 7.5 上安装了 WordPress,它通过代理访问互联网,网站的某些部分将发出客户端外部请求(图像、YouTube 视频等),需要用户输入他们的代理如果他们通过 Intranet 访问该站点,则提供凭据。

如果通过 Intranet 访问,我想隐藏该网站的某些元素,如果通过 Internet 访问,我想使其完全正常运行。

我发现 this SO answer 有点帮助(是的,由于 IIS,我将其更改为 LOCAL_ADDR)但由于代理而失败。

对站点的 Internet 请求通过在同一网络上的代理,因此它认为每个请求都是 Intranet 请求。

那么,如果我知道代理 IP,如何改进此功能以适应我的情况?

function is_intranet() {
  $serverIP = explode('.',$_SERVER['LOCAL_ADDR']);
  $localIP  = explode('.',$_SERVER['REMOTE_ADDR']);
  return ( 
    ($serverIP[0] == $localIP[0]) && 
    (in_array($serverIP[0],array('127','10','172','192') ) ) 
  );
}

【问题讨论】:

    标签: php wordpress iis proxy http-proxy


    【解决方案1】:

    代理?我想你的意思是反向代理。如果是这样,许多反向代理会在原始请求中添加额外的 http 标头。检查您的请求标头是否包含“X-Forwarded-For”http://en.wikipedia.org/wiki/X-Forwarded-For
    一般来说,最后一项就是您要查找的内容。
    一个 C# 示例:

    string xff = request.Headers["X-Forwarded-For"];
    if (xff != null)
    {
        string[] clientIPList = xff.Split(','); 
        string ip = clientIPList.Last();
    }
    

    【讨论】:

    • 这似乎是合乎逻辑的解决方案,因为与检查客户端是否在同一个域中相比,测试存在的代理更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2021-11-30
    • 2016-10-17
    • 2014-10-18
    • 1970-01-01
    • 2013-08-27
    • 2014-11-16
    相关资源
    最近更新 更多