所以我们想到的场景如下。
我们有一个 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
点击“单击此处忽略不匹配...”,将获得
在配置中,
我们可以看到支持 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
在 PowerShell 中(以管理员身份),如果使用调用 Web 请求
Invoke-WebRequest -Uri trees.com/ficus/macrophylla
然后会得到
如果使用
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?”。