クロスドメインの問題を解決するにはどうすればよいですか?一般的なソリューションの簡単な分析
クロスドメインは開発においてよく遭遇するシナリオであり、インタビューでもよく議論される質問でもあります。一般的なクロスドメイン ソリューションとその背後にある原則を習得すると、開発効率が向上するだけでなく、面接もより快適になります。
それでは今日は、フロントエンドの観点からクロスドメインの問題を解決するためのいくつかの一般的な方法についてお話しましょう。
#クロスドメインとは#クロスドメインについて話す前に、まず URL のコンポーネントを見てみましょう:
URL 構成の内容には、通常、
プロトコル、ホスト名、ポート番号、パス、クエリ パラメーター、およびアンカー部分が含まれます。 URL の例を次に示します:
https://www.example.com:8080/path/resource.html?page=1&sort=desc#header
上の例:
# プロトコルは HTTPS# ホスト名は www.example.com
● ポート番号は 8080
# パスは /path/resource.html
#● クエリ パラメータは page=1&sort=desc
#● アンカー ポイントは header
※いわゆるクロスドメインとは、リクエストURL内のプロトコル、ホスト名、ポート番号のいずれかの部分が異なることを指します。
上記の URL を例に挙げると、次のような記述方法がクロスドメインとみなされます。
http://www.example.com:8080/ // 协议不同 https://www.example.a.com:8080/ // 主机名不同 https://www.example.com:8081/ // 端口号不同
なぜクロスドメインなのか
実際には クロスドメインの問題の発生は、ブラウザの同一生成元ポリシー
によって制限されています。いわゆる同一オリジン ポリシーは、実際にはブラウザのセキュリティ メカニズムであり、Web ページ内のネットワーク リクエストを制限して、同じソース (ドメイン名、プロトコルとポート番号は同じです)リソースの主な目的は、悪意のある Web サイトがスクリプトを通じて他の Web サイトから機密データを盗むのを防ぎ、ユーザーのプライバシーとセキュリティを保護することです。
ブラウザ側のスクリプト (js ファイル) が他のドメインのネットワーク リソースにアクセスすると、クロスドメインの問題が発生します。
クロスドメインの問題を解決する方法
前述したように、クロスドメインの問題の発生はブラウザの同一オリジン ポリシーによって制限されているため、一般的な解決策は次のとおりです。クロスドメインの問題 解決策は実際にはブラウザを中心に展開します:
1. プロキシ サーバー
通常の開発では、クロスドメインの問題を解決するために が最も一般的に使用されます。ドメインの問題 解決策は、プロキシ サーバー
を使用することです。プロキシサーバー
クロスドメイン問題を解決するために、同一オリジンポリシーはサーバーにアクセスするブラウザのみに限定されており、サーバーにアクセスするブラウザには制限がないという特徴を実際に把握しています。サーバーにアクセスするサーバー仲介としてサーバーはリクエスト転送機能を持っています。 具体的には、フロントエンドエンジニアが書いたWebページは、webpackなどのスキャフォールディングで構築されたプロキシサーバー上で動作し、フロントエンドWebページがブラウザ上でネットワークリクエストを開始すると、実際にリクエストが送信されます。プロキシ サーバーに送信すると、プロキシ サーバーはリクエストをターゲット サーバーに転送し、ターゲット サーバーから返された応答をクライアントに転送します。
プロキシ サーバーは、このプロセスで中継の役割を果たし、リクエストと応答を変更、フィルタリング、インターセプトして、特定の機能を実現します。フロントエンド Web ページはプロキシ サーバー上で実行されるため、クロスドメインの問題は発生しません。
それでは、プロキシ サーバーはオンライン環境や開発環境でどのようにリクエストを転送するのでしょうか?
1. オンライン環境
オンライン環境では、通常、転送されたフロントエンド リクエストを転送するリバース プロキシとして nginx
を使用します。ターゲットインターフェイス。nginx は軽量で同時実行性の高い Web サーバーであり、イベント駆動型のクロスプラットフォームであり、ウィンドウと Linux の両方で構成できます。
開発中のクロスドメインの問題を解決するプロキシ サーバーとして機能する主な方法は、オンライン フロントエンド URL の実行ポートをリッスンし、リクエストが発生した後にリクエストを転送することです。特別なタグ
が含まれています。2. 開発環境
開発環境では、webpack を使用して構築されたフロントエンド プロジェクトであっても、vite またはその他のスキャフォールディングを使用して構築されたフロントエンド プロジェクトであっても、コアクロスドメインの問題の解決は、http-proxy-middleware ミドルウェア
の助けを借りて実装されます。 http-proxy-middleware ミドルウェアの中核は、http-proxy をさらにカプセル化したものです。 これは、http-proxy-middleware
を使用してプロジェクトにリクエスト転送機能を実装するサンプル コードです:const { createProxyMiddleware } = require('http-proxy-middleware'); module.exports = { server: { proxy: { // 将 /api/* 的请求代理到 http://localhost:3000/* '/api': { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: { '^/api': '/' } } } } };これで、 ネイティブ ノードを使用できるようになります。 , http-proxy ライブラリを使用してプロキシ サーバーを構築します。 リクエスト転送機能を備えたデモ。興味のある友達は自分でテストしてプレイできます。:
1.
まず、空のフォルダー (英語名) をプロジェクト フォルダーとして使用し、npm init -y コマンドを使用して、プロジェクトをノード プロジェクト
npm init -y2 にアップグレードします。 次に、プロジェクトのルート ディレクトリに
index.html ファイル を作成して、クロスドメイン リクエストを開始します。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>请求转发测试</title> </head> <body> <h1>请求转发测试</h1> <p id="message"></p> <script> fetch('/api/login') .then(response => response.text()) .then(data => { document.getElementById('message').textContent = data; }); </script> </body> </html>3. 次に、新しい
を作成します。プロジェクトのルート ディレクトリの .js ファイル にインデックスを付けて、サーバー側のコードを記述します。 index.js ファイルは、リクエスト転送機能を備えたプロキシ サーバーを実装するためのコア ファイルです。
const http = require('http'); const httpProxy = require('http-proxy'); const fs = require('fs'); const path = require('path'); // 创建代理服务器实例 const proxy = httpProxy.createProxyServer({}); // 创建HTTP服务器 const server = http.createServer((req, res) => { if (req.url === '/' || req.url.endsWith('.html')) { // 读取HTML文件 const filename = path.join(__dirname, 'index.html'); fs.readFile(filename, 'utf8', (err, data) => { if (err) { res.writeHead(500); res.end('Error reading HTML file'); } else { res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(data); } }); } else if (req.url.startsWith('/api')) { // 重写路径,替换跨域关键词 req.url = req.url.replace(/^\/api/, ''); // 将请求转发至目标服务器 proxy.web(req, res, { target: 'http://localhost:3000/', changeOrigin: true, }); } }); // 监听端口 server.listen(8080, () => { console.log('Server started on port 8080'); });4. 次に、クロスドメイン アクセスをテストするためにターゲット サーバーのコンテンツを書き込みます
target.js ファイル:
const http = require('http'); const server = http.createServer((req, res) => { if (req.url.startsWith('/login')) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('我是localhost主机3000端口下的方法,恭喜你访问成功!'); } else { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, world!'); } }); server.listen(3000, () => { console.log('Target server is listening on port:3000'); })
5. 打开终端,输入启动目标服务器的命令:
node ./target.js //项目根目录下执行
6. 再开一个终端启动代理服务器,等待浏览器端发起请求就可以啦:
node ./index.js //项目根目录下执行
7. 最后在浏览器里访问http://localhost:8080, 打开控制台即可查看效果:
可以发现,浏览器network模块的网络请求确实是访问的8080端口的方法,但是我们的服务器默默的做了请求转发的功能,并将请求转发获取到的内容返回到了前端页面上。
其实http-proxy是对node内置库http的进一步封装,网络请求的核心部分还是使用http创建一个服务器对象去访问的。感兴趣的同学可以再读读http-proxy的源码~
除了代理服务器这种绕过浏览器同源策略的解决方式外,从前端的角度解决跨域问题还有如下一些常见的方法:
1.借助JSONP
JSONP的原理是通过动态创建
脱衣画像を無料で リアルなヌード写真を作成する AI 搭載アプリ 写真から衣服を削除するオンライン AI ツール。 AI衣類リムーバー 完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。 使いやすく無料のコードエディター 中国語版、とても使いやすい 強力な PHP 統合開発環境 ビジュアル Web 開発ツール 神レベルのコード編集ソフト(SublimeText3)
ホットAIツール
Undress AI Tool
Undresser.AI Undress
AI Clothes Remover
Clothoff.io
Video Face Swap
人気の記事
ホットツール
メモ帳++7.3.1
SublimeText3 中国語版
ゼンドスタジオ 13.0.1
ドリームウィーバー CS6
SublimeText3 Mac版

PHPコードはさまざまな方法で実行できます。1。コマンドラインを使用して「PHPファイル名」を直接入力してスクリプトを実行します。 2.ファイルをDocument Root Directoryに入れ、Webサーバーを介してブラウザを介してアクセスします。 3. IDEで実行し、組み込みのデバッグツールを使用します。 4.テストには、オンラインPHPサンドボックスまたはコード実行プラットフォームを使用します。

Linuxシステムは、リソースの過度の使用を防ぐために、ULIMITコマンドを介してユーザーリソースを制限します。 1.ulimitは、ファイル記述子(-n)、メモリサイズ(-v)、スレッドカウント(-u)などの数を制限できるビルトインシェルコマンドであり、ソフト制限(現在の有効値)とハードリミット(最大上限)に分割されます。 2。Ulimit-N2048などの一時的な変更には、Ulimitコマンドを直接使用しますが、現在のセッションでのみ有効です。 3.永続的な効果を得るには、/etc/security/limits.confを変更し、PAM構成ファイルを変更し、SessionRequiredPam_limits.soを追加する必要があります。 4. SystemDサービスは、ユニットファイルにLIMを設定する必要があります

DebianシステムでNginxを構成する場合、以下はいくつかの実用的なヒントです。構成ファイルの基本構造グローバル設定:NGINXサービス全体に影響を与える行動パラメーターを定義します。イベント処理パーツ:Nginxがネットワーク接続をどのように扱うかを決定することは、パフォーマンスを改善するための重要な構成です。 HTTPサービスパーツ:HTTPサービスに関連する多数の設定が含まれており、複数のサーバーとロケーションブロックを埋め込むことができます。コア構成オプションworker_connections:各ワーカースレッドが処理できる接続の最大数を定義します。通常は1024に設定されています。Multi_accept:マルチ接続受信モードをアクティブにし、同時処理の能力を高めます。 s

Dockerコンテナ化テクノロジーを通じて、PHP開発者はPHPstormを使用して、開発効率と環境の一貫性を改善できます。特定の手順には以下が含まれます。1。PHP環境を定義するDockerFileを作成します。 2。phpstormでDocker接続を構成します。 3. DockerComposeファイルを作成して、サービスを定義します。 4.リモートPHPインタープリターを構成します。利点は強力な環境の一貫性であり、欠点には長いスタートアップ時間と複雑なデバッグが含まれます。

DebianApache2のSEO最適化スキルは、複数のレベルをカバーしています。いくつかの重要な方法を次に示します。キーワード調査:ページのコアと補助キーワードをマイニングするためのツール(キーワードマジックツールなど)を使用します。高品質のコンテンツ作成:貴重でオリジナルのコンテンツを生成します。コンテンツは、スムーズな言語と明確な形式を確保するために、詳細な研究を実施する必要があります。コンテンツのレイアウトと構造の最適化:タイトルと字幕を使用して、読書をガイドします。簡潔で明確な段落と文章を書いてください。リストを使用して重要な情報を表示します。写真やビデオなどのマルチメディアを組み合わせて、表現を強化します。空白の設計により、テキストの読みやすさが向上します。技術レベルのSEO改善:robots.txtファイル:検索エンジンクローラーのアクセス権を指定します。 Accelerate Webページの読み込み:キャッシュメカニズムとApache構成の助けを借りて最適化

DebianシステムにDockerの自動展開を実装することは、さまざまな方法で実行できます。詳細な手順ガイドは次のとおりです。最初にdockerをインストールして、Debianシステムが最新のままであることを確認してください:sudoaptupdatesudoaptupgrade-y次に、必要なソフトウェアパッケージをインストールして、httpsを介してリポジトリへの適切なアクセスをサポートします:sudoaptinstallapt-transport-transport-httpsca-cartifatecurlsoft-cortecursoft-properties-common-common-compg inphy com

マルチバージョンApacheの共存は、次の手順を通じて実現できます。1。異なるバージョンのApacheを異なるディレクトリにインストールします。 2。各バージョンの独立した構成ファイルとリスニングポートを構成します。 3.仮想ホストを使用して、さまざまなバージョンをさらに分離します。これらの方法により、複数のApacheバージョンを同じサーバーで効率的に実行して、さまざまなプロジェクトのニーズを満たすことができます。

主にメッセージキュー、キャッシュ、ロードバランス、アプリケーションサーバー、分散サービスフレームワークなど、Javaミドルウェアテクノロジーには多くの種類があります。 1。ApachekafkaやRabbitMQなどのメッセージキューミドルウェアは、非同期通信とデータ送信に適しています。 2. RedisやMemcachedなどのキャッシュミドルウェアは、データアクセス速度を改善するために使用されます。 3. NginxやHaproxyなどのミドルウェアのロードを使用して、ネットワークリクエストを配布します。 4. TomcatやJettyなどのアプリケーションサーバーミドルウェアは、Javawebアプリケーションの展開と管理に使用されます。 5。DubboやSpringCloudなどの分散サービスフレームワークは、マイクロサービスアーキテクチャを構築するために使用されます。ミドルウェアを選択するときは、パフォーマンスとスケーラビリティを考慮する必要があります。
