http://www.kawa.net/works/ajax/romanize/romanize.cgi?q=%ED%96%88%EB%8B%A4?&mode=hangulisにアクセスしようとすると、「許可されていません」というエラーしか表示されませんAccess-Control-Allow-Origin." この問題をグーグルで検索したところ、2 つの提案が見つかりました。これらのどちらも機能しませんでした。私が収集したものから、これはセキュリティ上の理由によるものです。代わりに、代わりに外部 URL に接続する PHP ファイルを使用する代わりに、$http 要求をサーバーに送信することを考えています。私の質問は次のとおりだと思います:それを行う必要がありますか、それともクライアントスクリプトからそれを行う方法はありますか?
1 に答える
クロス サイト スクリプティング攻撃からそれらを保護するために、ブラウザーには、最初に要求された HTML ページと同じドメイン内にない URL に対して JavaScript が HTTP (別名 AJAX) 要求を行うのを防ぐ組み込みのセキュリティ機能があります。
[特に、元の HTML ファイルがローカル ファイル システム (つまり、file:///...) から受信された場合、Chrome はすべての HTTP リクエストを制限します。あなたが述べているように、 --allow-file-access-from-files オプションでこれをオフにするか、ファイルシステムから直接ではなく、常にウェブサーバーからページをロードすることで修正できます.]
これは、JavaScript アプリケーションが別のドメインにあるサードパーティによって提供される Web サービスにアクセスする有効なケースが多数あるため、かなり制限的であることが判明しました。あなたのケースでは、韓国のハングル文字をローマ字化するサービスにアクセスしたいと考えています。
したがって、この制限を回避する方法はいくつかあります。
サーバー上のプロキシ
1 つ目は、リクエストをサード パーティのサービスに渡し、ブラウザに返すプロキシ サービスを独自のサーバーに提供することです。ブラウザは、元の HTML を取得した場所から同じサーバー (つまりドメイン) にリクエストを送信しているので、満足しています。
JSONP
2 つ目は、JSONP ( http://en.wikipedia.org/wiki/JSONP )などのハックを使用することです。これには、新しいスクリプト タグを HTML に動的に追加し、新しい JavaScript ファイルをロードして実行します。データのラップを解除して使用するには、ブラウザーでアプリケーションによって提供される関数への呼び出しで要求したデータをラップするようにサーバーを構成する必要があります。これは、.jsonp メソッドを使用する AngularJS $http サービスによってサポートされています: http://docs.angularjs.org/api/ng .$http#jsonp. 詳細については、ページの下部にある例をご覧ください。
CORS
最後の最も洗練された方法は、Cross Origin Resource Sharing (CORS) と呼ばれる標準を利用することです: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing。これは現在、ほとんどのブラウザーで提供されている標準であり、ブラウザーは別のドメインでリソースをホストしているサーバーとネゴシエートして、特定のデータを返すことができることに同意することができます。クライアント アプリケーションを変更する必要はなく、$http で完全にサポートされていますが、適切に応答できるようにサーバーをセットアップする必要があります。あなたが言及しているサービスはこれをサポートしていないと思います。ところで、CORS が動作している場合は、多数の余分な OPTION リクエストがサーバーに送信されていることがわかります。これはネゴシエーション メカニズムの一部であり、完全に正常です。