如何在 IIS 中设置到外部服务器的反向代理

如何在 IIS 中设置到外部服务器的反向代理

所以我们想到的场景如下。

我们有一个 IFRAME。该 IFRAME 想要指向 上的资源https://trees.com。例如,它可能是https://trees.com/ficus/macrophylla。但是,尽管我们向 发出了所有请求trees.com,但他们拒绝允许我们直接链接到他们的网站,从而阻止了跨源请求。

因此我们决定设置反向代理。我们听说过 nginx 和 apache,但无论好坏,我们都对微软的技术情有独钟,因此我们决定使用 IIS。

使用我们的一台 Azure 服务器,我们创建一个网站,我们称之为https://figs.wild.com.au。我们配置 IFRAME,以便请求https://trees.com/ficus/macrophylla实际上转到https://figs.wild.com.au/trees/ficus/macrophylla

到了这一步,我们就有点疯狂了。

实际上,是否有可能在服务器上将请求https://figs.wild.com.au/trees/ficus/macrophylla转换figs.wild.com.au为请求,https://trees.com/ficus/macrophylla并将响应反馈给 IFRAME 请求的发起者?

我们做了很多搜索,并且不断发现一些事情几乎有效。什么才是真正有效的?IIS 的 Url Rewrite 是可以使用的吗?如果可以使用,规则应该是什么样的?或者我们应该使用一些 C# 的东西?

答案1

如果我去http://www.trees.com/ficus/macrophylla使用浏览器,然后会得到

未找到

如果我去http://www.trees.com/还将获得以下内容

不确定这是否应该是这样的


使用 SSL 请求访问 trees.com

SSL 请求

点击“单击此处忽略不匹配...”,将获得

SSL 请求 trees.com

在配置中,

SSL 请求配置

我们可以看到支持 TLS 1.0、1.1、1.2 和 1.3。其中绿色代表 TLS 1.2 和 1.3。

我们可以配置 PowerShell 以使用 TLS 1.3

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls13

并确认将使用它

[Net.ServicePointManager]::SecurityProtocol

TLS13 PowerShell


在 PowerShell 中(以管理员身份),如果使用调用 Web 请求

Invoke-WebRequest -Uri trees.com/ficus/macrophylla

然后会得到

404 未找到

如果使用

Invoke-WebRequest -Uri trees.com

然后会得到

有效


到目前为止一切顺利。但如果我们想从https://figs.wild.com.au

(Invoke-WebRequest -Uri 'http://trees.com' -Headers @{ "Origin" = "https://figs.wild.com.au" }).Headers

我们得到

Key                           Value
---                           -----
Transfer-Encoding             chunked
X-Adblock-Key                 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL/3/SrV7P8AsTHMFSpPmYbyv2PkACHwmG9Z+1IFZq3vA54IN7pQcGnhgNo+8SN9r/KtUWCb9OPqTfWM1N4w/EUCAwEAAQ==_FamzgofQ7ugTniHINrZ7yp35i/Nqkt7q/gZsgPGyvhOwIQhj04Bd9+/nir6OLAFDPB56kU4m0GgS7SvEoFqRbQ==
Access-Control-Allow-Origin   *
Access-Control-Allow-Methods  *
Access-Control-Request-Method *
Access-Control-Allow-Headers  *
Access-Control-Max-Age        86400
X-UA-Compatible               IE=Edge,chrome=1
X-Request-Id                  556905ec3cb435a1168cc1b28d70875f
X-Runtime                     0.048014
X-Rack-Cache                  miss
Cache-Control                 max-age=0, private, must-revalidate
Content-Type                  text/html; charset=utf-8
Date                          Mon, 20 Jul 2020 09:40:37 GMT
ETag                          "8e51e434b70033ee6a90cb7397af53f9"
Set-Cookie                    _digiadmin2_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTNmOWRlMDA5NjRiZWZlMzgyZTRmN2NlOWIzZmQxZjIzBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMVFOckhMdElRMWc1cGZBcGl5OGQ1WkVNeXo3elpobWRwc2QyR0djTFlNUEE9BjsARg%3D%3D--e55261be794bb9f95ee407c73a3e2b315ef...
Server                        nginx/1.10.1

标题键值

请注意访问控制允许来源具有价值星号 (*)这意味着允许任何域。然后,如果我们使用以下命令

Invoke-WebRequest -Uri 'http://trees.com' -Headers @{ "Origin" = "https://figs.wild.com.au" }

我们将得到以下结果

正如预期的那样


换句话说,它允许跨源请求,而不是像您在问题中提到的那样阻止。可能您也只是为了解释而提供了虚构的 URL。

答案2

关于这个问题,并考虑到评论,在 IIS 中重定向到外部 URL 是可能的,因为显示在这里

<system.webServer>
  <rewrite>
    <rules>
      <rule name="External Redirect" stopProcessing="true">
        <match url="^VirtualDirectory" negate="true" />
        <conditions>
          <add input="{HTTP_HOST}" ignoreCase="true" negate="true" pattern="hostname"/>
          <!-- add this input condotion to make this redirect url not work with http://hostname/VirtualDirectory -->
        </conditions>
        <action type="Redirect" url="{your url}" redirectType="Found" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

此外,使用 NGIX 也可以实现简单的重定向,例如:在这个答案中

server {
    listen 80;
    server_name     example.com;
    return          301 http://www.example.com$request_uri;

server {
    listen 80;
    server_name     www.example.com;
    [...]

在这个答案中

server {
  listen 80;
  server_name localhost;
  merge_slashes off;

  location /rdr {
    location /rdr/http:// {
      rewrite ^/rdr/(.*)$ $1 permanent;
    }
    rewrite ^/rdr/(.*)$ http://$1 permanent;
  }
}

然而,您想要的不是查看该页面的内容,而是将数据保存到任何地方,然后再次重定向。那么这些数据将从哪里来提供给 IFRAME?


redirect > save data > redirect我建议不要这样做,而是单独执行该操作。更具体地说,您可以从中获取数据https://trees.com/ficus/macrophylla并将其保存在https://figs.wild.com.au/trees/ficus/macrophylla并将该文件中所需的内容用于 IFRAME。

获取该位置的文件内容https://trees.com(没有来自其他文件的 JS 和 CSS)并将其保存在 html 文件中,你可以执行以下操作

from urllib.request import urlopen
html = urlopen("http://trees.com").read().decode('utf-8')
#print(html)
with open("test.html", "w") as file:
    file.write(html)

这会将内容保存在位于此脚本同一位置的名为 test 的 HTML 文件中。

(如果还需要 CSS 和 JS,请检查这个问题)。

如果你不想经历这种麻烦,可以使用以下工具HT轨道允许下载完整的网站。这样,您就不需要知道地图站点,然后迭代可能的变体。


我明白你想要什么便利。我会进一步调查,如果发现超级自动化这样做的方法,但有助于了解“这些数据从哪里来,然后提供给 IFRAME?”。

相关内容