Nginxはクロスドメインの問題を解決し、サードパーティのページを埋め込む

Nginxはクロスドメインの問題を解決し、サードパーティのページを埋め込む

序文

私たち自身のシステムは、サードパーティのシステムからいくつかのコンポーネントをロードする必要があります。計画としては、サードパーティが関連するインターフェースを開発して提供することになっています。私たちはインターフェースを通じてデータを取得し、そのデータを使用してシステムに関連する機能を実装します。

残念ながら、リーダーシップは調整しませんでした。通常の方法が機能しない場合は、何か特別なことをする必要があります。

前述のように、インターフェースを使用してデータを取得して再レンダリングします。これは比較的一般的な方法です。欠点は、関連するモジュールを再実装する必要があり、相手側にインターフェースを開くよう要求することです。

今は、異常なチャネルしか使用できません。たとえば、ページを自社のシステムに直接埋め込むことは簡単に考えられますが、同時にサードパーティのページのスタイルとコンポーネントを制御する必要があります。

困難

上記の方法は、自社システムで iframe を計画し、src 属性を通じてサードパーティのシステムを導入する方法です。
ここでの最大の問題はクロスドメインです。インターネット上で言及されている最も可能性の高い解決策は、postMessage を使用してドメインを越えることです。残念ながら、これには依然としてサードパーティの協力が必要です。

クロスドメイン定義

まず、狭義の相同性とは、ドメイン名、プロトコル、ポートが同じであることを意味します。
クロスドメインとは、ブラウザが他の Web サイトのスクリプトを実行できないことを意味します。これは、ブラウザが JavaScript に実装するセキュリティ制限であるブラウザの同一オリジン ポリシーによって発生します。

nginxの機能

リバースプロキシ

URL を設定します。ユーザーがこの URL にアクセスすると、プロキシは実際に必要な URL に誘導されます。

静的と動的の分離

名前が示すように、動的リソース (サーバーの計算が必要) は静的リソース (通常は html、css、js、img などの静的ページに関連するリソースを指します) から分離されます。

達成しようとする

Aアプリケーションはポート80を使用し、サードパーティのBシステムもポート80を使用しているため、Bシステムへのプロキシを区別するためにサフィックスを追加する必要があります。おおよそのURLは次のとおりです。

# AのURL
http://ローカルホスト/
# B 接尾辞付き URL
http://localhost/3 部構成
# Bの実際のURL
http://172.16.1.1/

通常、localhost にアクセスすると、システム A のホームページが表示されます。172.16.1.1 にアクセスすると、システム B のホームページが表示されます。プロキシ URL 経由でアクセスすると、nginx は実際に 172.16.1.1/three-part にプロキシします。はい、テスト時に、サフィックスが引き継がれていることがわかりましたか? ? 私が専門家ではなく、適切に設定していない可能性もありますが、これは私のテストの結果です。

上記の構成の考え方は、2つのアプリケーションに同じIPとポートを持たせ、アプリケーションAのiframeがアプリケーションBのホームページを読み込み、jsを介して操作できるようにすることです。

残念ながら、唯一の方法は、別のポートを設定することです。たとえば、アプリケーション B のプロキシ URL を localhost:81/ に設定します。この方法では、アプリケーション A の iframe に対応するページでアプリケーション B を変更する js を記述することはできません。

最終結果

アプリケーション B で F12 を押すと、ログインしてホームページに入るときに読み込まれる x.min.js ファイルがカプセル化されていることがわかりました。
そこで、ここにトリックがあります。私は js ファイルを直接書き換え、必要なロジックをファイルの最後に配置し、この x.min.js をロードするときに、サードパーティのサーバーで x.min.js をロードするのではなく、自分のサーバーで変更された js ファイルをページにロードさせます。

全体のプロセスの概略図を以下に示します。

以下は私が設定して使用しているnginxの設定です

上流ミール{
    サーバー 10.1.128.58:80;
}
サーバー{
 listen localhost:8001; # nginx は URL と対応するポートの場所を listen する必要があります =/static/mir.min.js {
  ルート C:/r9/bin/resources;
 }
 位置 / {
  # ここでは URL 変数名が使用されており、この変数名はアップストリーム proxy_pass http://mir で定義されていることがわかります。
  # 以下の項目は標準のクロスドメイン構成とみなされるため、コピーするだけです proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
  $request_method = 'OPTIONS'の場合{
   204を返します。
  }
 }
 # 静的リソースの解放場所 ~ \.(gif|jpg|jpeg|css|js|svg)$ {
  proxy_pass http://mir;
  proxy_set_header ホスト $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
  有効期限は30日です。
 }
 # クロスドメインリクエストヘッダーを追加します。add_header 'Access-Control-Allow-Origin' '*';
 add_header 'Access-Control-Allow_Credentials' 'true';
 add_header 'Access-Control-Allow-Headers' 'Authorization、Accept、Origin、DNT、X-CustomHeader、Keep-Alive、User-Agent、X-Requested-With、If-Modified-Since、Cache-Control、Content-Type、Content-Range、Range';
 add_header 'アクセス制御許可メソッド' 'GET、POST、OPTIONS、PUT、DELETE、PATCH';
 #エラーページ 404 /404.html;

 # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
 # 通常のわかりやすいエラーページを設定します error_page 500 502 503 504 /50x.html;
 場所 = /50x.html {
  ルートhtml;
 }

}

nginx の URL マッチングには、最初のマッチング原則という機能があります。各リクエストに対して、上から下まで、最初に一致したルールがあれば、そのルールに設定された URL に直接ジャンプします。

話題外

サードパーティのシステムは実際には通常のシステムであるためです。たとえば、ログインページが標準で付属しています。ログイン手順を処理する必要があります。したがって、x.min.js でサードパーティのシステムが正しくロードされているかどうか、およびログイン操作が必要かどうかを検出する必要があります。同時に、使いやすさのために、マスクレイヤーを追加する必要があります。サードパーティのページをクリーンアップする前に、顧客がそれを見ることができないようにカバーする必要があります。
サードパーティ システムが正しく読み込まれたら、必要に応じて機能を調整したり、スタイルを置き換えたりすることができます。

nginx がクロスドメインの問題を解決し、サードパーティのページを埋め込む方法についての記事はこれで終わりです。サードパーティのページの nginx クロスドメイン埋め込みの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx 構成 クロスドメイン リクエスト Access-Control-Allow-Origin * 詳細な説明
  • nginx を使用して Cookie のクロスドメイン アクセスを解決する方法
  • NginxサーバーでAJAXクロスドメインリクエストを処理するための設定方法の説明
  • Nginxはアドレス転送時のクロスドメイン問題を解決します
  • Nginx リバース プロキシを使用してクロスドメイン問題を解決する方法の詳細な説明
  • nginxサーバーは設定を通じてAPIのクロスドメイン問題を解決します
  • ドメイン間でフォントファイルを使用するように Nginx を設定する方法
  • Nginx を使用してフロントエンドのクロスドメイン問題を解決する方法
  • Nginxサーバー構成はajaxのクロスドメイン問題を解決します

<<:  空のパスがページのパフォーマンスに与える影響に対する解決策

>>:  JS配列ループ方式と効率分析の比較

推薦する

Docker 階層化パッケージを使用して Spring Boot を設定する方法

Spring Boot プロジェクトでは、Docker コンテナ、jar、war の階層化パッケージ...

MySQL の char、varchar、text フィールド タイプの違い

MySQL では、char、varchar、text の各タイプのフィールドはすべて文字タイプのデー...

jQueryはアコーディオンの小さなケースを実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

DockerコンテナがJupyterにアクセスできない問題の解決策

このプロジェクトでは、環境を構築するために Docker コンテナを使用します。Dockerfile...

HTMLは正規表現を使用してテーブルの例をテストします

以下は、HTML で正規表現を使用してテーブルをチェックするサンプル コードです。具体的なコードの内...

MySQL テーブルの読み取り、書き込み、インデックス作成、その他の操作の SQL ステートメントの効率最適化の問題を分析します。

前回は、Explain 実行プランの表示、インデックスの分析など、MySQL での SQL クエリの...

MySQL 8.0 でのチェック制約の実装

みなさんこんにちは。私は技術の話ばかりして髪を切らない先生のトニーです。今回はMySQL 8.0で追...

Vue の計算プロパティの詳細な説明

目次補間式方法計算された要約する今日は、Vue の計算プロパティについてお話ししましょう。計算プロパ...

...

Ubuntu 16.04 で Python 3 を使用して Django プロジェクトを作成し、実行する方法

ステップ1: Djangoプロジェクトを作成するターミナルを開き、書き込みたいプロジェクトのアドレス...

HTML2 キャンバス SVG が認識されない場合の解決策

ウェブページを画像としてキャプチャする新機能があったので、人気のhtml2canvasを使ってみまし...

いくつかの重要なMySQL変数

MySQL 変数は数多くありますが、その中には注目に値するものもあります。ここでは、参考までに、注目...

MySQL データベースの最適化: インデックスの実装原則と使用状況の分析

この記事では、例を使用して、MySQL データベースの最適化のためのインデックス実装の原則と使用方法...

MySQL データベースのデータ テーブルの最適化、外部キーの分析、3 つのパラダイムの使用

この記事では、例を使用して、MySQL データベースのデータ テーブルの最適化、外部キーの使用、およ...

MySQL 圧縮版 zip のインストールに関する問題の解決策

本日、MySQLの圧縮版をインストールする際に問題が発生しました。サービスが起動できず、2、3時間苦...