Как настроить обратный прокси-сервер для внешнего сервера в IIS

Итак, сценарий, который мы имеем в виду, выглядит следующим образом:

У нас есть 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 штуку?

3
задан 17 July 2020 в 12:49
2 ответа

Если я перейду на http://www.trees.com/ficus/macrophylla с помощью браузера, то получит

not found

Если я перейду на http://www.trees.com/ , я также получу следующее:

Not sure if that's how it should look like


Использование SSL-запроса к tree.com

SSL Request

Щелчок «Щелкните здесь, чтобы игнорировать несоответствие ...», тогда будет получено

SSL Request trees.com

В конфигурации,

SSL Request configuration

мы видим, что 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 (в качестве администратора), если используется Invoke-WebRequest

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

тогда получит

404 not found

, а если использовать

Invoke-WebRequest -Uri trees.com

, то получит

it worked


Пока все хорошо. Но если мы хотим протестировать его для 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

Headers key Value

Обратите внимание, что Access-Control-Allow-Origin имеет значение звездочка (*) , что означает, что разрешен любой домен. Затем, если мы воспользуемся следующей командой

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

, мы получим следующий результат

As expected


Другими словами, он разрешает межсайтовый запрос, а не блокирует, как вы упоминаете в вопросе. Возможно, вы также указываете фиктивные URL-адреса только для объяснения.

1
ответ дан 4 January 2021 в 07:46

Что касается вопроса и учитывая комментариев, перенаправление на внешний 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?».

1
ответ дан 4 January 2021 в 07:46

Теги

Похожие вопросы