我正在尝试编写一个执行 HTTP 请求的 PowerShell 脚本。该请求由 PHP 脚本处理,该脚本需要知道客户端的 IP 地址。为此,它读取$_SERVER['REMOTE_ADDR']
。
现在,出现以下奇怪的行为:
- 当我使用 whatismyip.com 之类的服务时,我的 IP 是
xxx.yyy.141.183
- 当我使用 Web 浏览器调用我的 PHP 脚本时,
$_SERVER['REMOTE_ADDR']
返回与上面相同的 IPxxx.yyy.141.183
(如预期的那样)。 - 当我使用 PowerShell 脚本调用同一个 PHP 脚本时,
$_SERVER['REMOTE_ADDR']
返回不同的 IP,即xxx.yyy.51.111
。
PowerShell 脚本非常简单:
$wc = New-Object System.Net.WebClient
$wc.DownloadString("http://example.net/myscript.php")
我在连接到我所在大学的网络时观察到了这种行为。因此,我不知道有关网络配置的任何细节。我注意到,使用要点 1 和 2 中的方法,不同的机器似乎具有不同的 IP,但使用第三种方法,它们都具有相同的 IP。
问题:如何修改我的 PowerShell 脚本以“像 Web 浏览器一样运行”,即发送请求,其中服务器看到的远程地址等于从 Web 浏览器接收请求时看到的远程地址?
附加问题:为什么会发生这种情况?
答案1
由于发现只有 Firefox 会使用正确的公网 IP 进行请求,xxx.yyy.141.183
而 IE 和 Chrome 则不会,因此我找到了以下解决方案:
- 不同浏览器的行为不同意味着问题与 PowerShell 没有直接关系,而是源于代理设置。
- 我意识到 Firefox 被设置为“使用系统的代理设置”。当我将其更改为“自动检测网络的代理设置”(粗略翻译,抱歉)时,Firefox(就像 IE 和 Chrome 一样)会使用 IP 发出请求
xxx.yyy.51.111
。 - 由此我得出结论,PowerShell 必须使用一种配置,使其自动检测代理设置。这一猜想得到了以下事实的证实:文档:
Proxy 属性标识代表此 WebClient 对象与远程服务器通信的 IWebProxy 实例。系统使用配置文件和 Internet Explorer 局域网设置来设置代理。若要指定不应使用代理,请将 Proxy 属性设置为 GetEmptyWebProxy 方法返回的代理实例。
由于我不想更改系统配置,并且
GlobalProxySelection.GetEmptyWebProxy
已被弃用,我现在成功地使用了建议的解决方案这里:只需将proxy
属性设置为null
。$wc = New-Object System.Net.WebClient $wc.Proxy = $null $wc.DownloadString("http://example.net/myscript.php")