Итак, сценарий, который мы имеем в виду, выглядит следующим образом.
У нас есть IFRAME. Указанный IFRAME хочет указать на ресурс на https://trees.com
. Это может быть, например, https://trees.com/ficus/macrophylla
. Однако, несмотря на все наши просьбы trees.com
, они отказывают нам в разрешении прямой ссылки на их сайт, блокируя запрос на другой источник.
Итак, мы решили, что хотим настроить обратный прокси. Мы слышали о nginx и apache, но у нас есть корпоративная приверженность технологиям Microsoft, хорошо это или плохо, поэтому решите в пользу 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 # -y штуку?
Что касается вопроса и комментариев, перенаправление на внешний URL-адрес возможно в IIS как показано здесь.
<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)
Это сохранит содержимое в HTML-файл с именем test, который находится в том же месте, что и этот сценарий.
(Если также требуются CSS и JS, проверьте этот ТАК вопрос).
Если вы не хотите проходить через эту суету, есть такие инструменты, как HTTrack которые позволяют загружать целые веб-сайты. Таким образом, вам не нужно будет знать мапсайт, чтобы затем перебирать возможные варианты.
Я вижу удобство того, что вы хотите. Мы продолжим расследование и сообщим вам, если обнаружите, что супер-автоматизированный способ сделать это, но поможет узнать, «Откуда будут поступать эти данные для загрузки в IFRAME?».
Если я пойду в http://www.trees.com/ficus/macrophylla используя браузер, то получите
Если я пойду в http://www.trees.com/ также получит следующие
Использование SSL-запроса к tree.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 (как администратор), если вы используете Invoke-WebRequest
Invoke-WebRequest -Uri trees.com/ficus/macrophylla
тогда получит
и если использовать
Invoke-WebRequest -Uri trees.com
тогда получит
Все идет нормально. Но если мы хотим протестировать его на CORS из 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
Заметь Access-Control-Allow-Origin имеет ценность звездочка (*) что означает, что разрешен любой домен. Затем, если мы воспользуемся следующей командой
Invoke-WebRequest -Uri 'http://trees.com' -Headers @{ "Origin" = "https://figs.wild.com.au" }
получим следующий результат
Другими словами, он разрешает запрос из разных источников, а не блокирует, как вы упоминаете в вопросе. Может быть, вы также даете фиктивные URL-адреса только для объяснения.