Итак, сценарий, который мы имеем в виду, выглядит следующим образом:
У нас есть IFRAME. Указанный IFRAME хочет указать на ресурс на https://trees.com
. Это может быть, например, https://trees.com/ficus/macrophylla
. Однако, несмотря на все наши запросы к tree.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 штуку?
Если я перейду на 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-адреса только для объяснения.
Что касается вопроса и учитывая комментариев, перенаправление на внешний 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?
Вместо того, чтобы делать это перенаправление> сохранение данных> перенаправление
, я бы предложил сделать это отдельно. В частности, вы должны получить данные с https://trees.com/ficus/macrophylla и сохранить их в местоположении https://figs.wild.com.au / tree / 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, проверьте этот вопрос SO ).
Если вы не хотите проходить через эту суету, есть такие инструменты, как HTTrack , которые позволяют загрузить полную веб-сайты. Таким образом, вам не нужно будет знать карту сайта, чтобы затем перебирать возможные варианты.
Я вижу удобство того, что вы хотите. Мы продолжим расследование и сообщим вам, если обнаружите этот суперавтоматический способ сделать это, но он поможет узнать: «Откуда тогда будут поступать эти данные для загрузки в IFRAME?».