12

API への依存度が高く、同時に API 自体と同じドメインに存在できない Web アプリケーションを開発する必要がある場合、非同期 HTTP リクエストを作成するときに「同一オリジン ポリシー」を回避するのは非常に困難です。 (AJAX)。ある時点で、(Windows 7 を実行している) 私のコンピューターに WAMP をインストールし、Apache でリバース プロキシを構成するように勧められました。同じ人が、ファイル内にdevhttpd.confという名前の IP 127.0.0.1 のエイリアスを作成するように指示した後、ファイルに追加した以下の Apache ディレクティブを提供してくれました(実際に実行しました)。c:\windows\system32\drivers\etc\hosts

LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule ssl_module modules/mod_ssl.so

Listen 127.0.0.1:8080
ProxyRequests off

<Proxy *>
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
</Proxy>

<VirtualHost dev:8080>
                ProxyPass / https://app.somesite.com:5002/
                ProxyPassReverse / https://app.somesitecom:5002/
                ProxyPassReverseCookieDomain app.somesite.com dev
                Header edit Location ^https://dev(:8080)?(.+)$ http://dev$1$2
                Header edit Set-Cookie "(^.+); secure; HttpOnly$" "$1; HttpOnly"
                SSLProxyEngine on
    SSLProxyVerify none
</VirtualHost>

サーバーの構成に関してはまったくの初心者なので、ディレクティブを貼り付けるだけで、幸いにもプロキシが機能しました。たとえば、ブラウザのアドレス バーを使用してアクセスすると、API から正しい応答が返されますhttp://dev:8080/a/w/currencies

残念ながら、同じ URL (以下のコード) への AJAX 要求により、Chrome でXMLHttpRequest cannot load http://dev:8080/a/w/currencies. Origin http://dev is not allowed by Access-Control-Allow-Origin.エラーが発生します。

$.ajax({
    url: "http://dev:8080/a/w/currencies",
    type: "GET",
    dataType: "json",
    data: {

    },
    success: function(data){
        console.log(data);
    }
}); 

では、このプロキシが AJAX で動作するためには、まだ何をしなければならないのでしょうか? 指示について何か言われたことがありますaliasが、具体的で明確ではないため、経験の浅い私の脳にはあまり意味がありませんでした。

PS: また、「問題は、dev:80 からファイルを取得し、dev:8080 に ajax することです」と言われました。私の経験不足を考えると、これもあまり意味がありません。

4

4 に答える 4

11

パブリック IP を持つサーバーがあり、Apache が実行されています。ここで、アプリケーションを LAN 上でホストし、インターネット上でアクセスできるようにしたいと考えています。重要な部分は、これらのアプリケーションが LAN 上のマシンで実行されていることです。

                           |--------------192.168.1.3
                           |            (internal3.example.com)
                           |
                           |--------------192.168.1.4
                           |            (internal4.example.com)
  (Public IP )             |
            A--------------|
(reverse proxy server)     |
  (192.168.1.25)           |
example.com                |
                           |--------------192.168.1.1
                           |            (internal1.example.com)
                           |
                           |--------------192.168.1.2
                           |            (internal2.example.com)

Debian ベースのシステムの場合、Web サイトの定義が行われる場合に備えて、Ubuntu を使用して Apache の vhost 定義をホストしています。

/etc/apache2/sites-enabled/*.conf

*conf に対応する場所

internal1.conf internal2.conf internal3.conf internal4.conf

これらの各サイトの vhost 定義は次のようになります。

/etc/apache2/sites-enabled/internal1.example.conf

<virtualhost *:80>
    ServerAdmin webmaster@localhost
    ServerName internal1.example.com
    ProxyRequests off
    <proxy *>
        Order deny,allow
        Allow from all
    </proxy >
    ProxyPass / http://192.168.1.1/
    ProxyPassReverse / http://192.168.1.1/ 
</VirtualHost>

/etc/apache2/sites-enabled/internal2.example.conf

<virtualhost *:80>
      ServerAdmin webmaster@localhost
      ServerName internal2.example.com
      ProxyRequests off
      <proxy *>
      Order deny,allow
      Allow from all
      </proxy >
      ProxyPass / http://192.168.1.2/
      ProxyPassReverse / http://192.168.1.2/
</VirtualHost >

/etc/apache2/sites-enabled/internal3.example.conf

<virtualhost *:80>
      ServerAdmin webmaster@localhost
      ServerName internal3.example.com
      ProxyRequests off
      <proxy *>
      Order deny,allow
      Allow from all
      </proxy >
      ProxyPass / http://192.168.1.3/
      ProxyPassReverse / http://192.168.1.3/
</VirtualHost >

/etc/apache2/sites-enabled/internal4.example.conf

<virtualhost *:80>
    ServerAdmin webmaster@localhost
    ServerName internal4.example.com
    ProxyRequests off
    <proxy *>
        Order deny,allow
        Allow from all
    </proxy>
    ProxyPass / http://192.168.1.4/
    ProxyPassReverse / http://192.168.1.4/
</VirtualHost>

上記の vhost 定義のすべてで、ログ ファイルのオプションを削除したことに注意してください。したがって、本番サーバーに適用する場合は、各 vhost ファイルにそれらを追加してください。上記は、それがどのように機能するかを明確に示すためのものです。私は非常に複雑な Apache セットアップを実行しているので、上記は参考になる小さな例です。

今、あなたの質問のAjaxの一部に来ています

Chrome で Ctrl+Shift+I を押すと、アプリケーションが壊れている場所が正確にわかります。手がかりが得られます ( Web アプリケーションを開発しているマシンとは異なるマシンからリクエストを発行します)。からのリクエストの場合、Apache ログhttp://sampleajx api を含むページが実際に apache サーバーに到達すると、より多くのヒントが得られます。プロキシがリクエストを正しく転送している場合は、live_http などのツールを使用して HTTP HEADERS を firefox に投稿します。リクエストがアプリケーションによって行われたため、ヘッダーを観察すると、リクエストがリバース プロキシの背後にあるサーバーに到達した場合に役立ちます。また、リバース プロキシを実行しているサーバーのログをチェックして、Web からのリクエストが到達したかどうか、およびリクエストが要求された URL に到達しました。これが手がかりになります。

そして、.conf ファイルの開発目的で、テストのためにしばらく書き換えルールを無効にし、1 つずつ実行します。

于 2013-01-06T20:11:35.757 に答える
1

ここでの問題は、ブラウザーが Web ページに配置されたランダムな JavaScript によってユーザーを保護しようとしていることです。すべての JavaScript を同じコンテキストで実行できるようにすると、Facebook セッションの Cookie やその他のデータを悪者に奪われてしまいます。

この場合、原因は非常に単純なものである可能性があります。Chrome は「dev」を完全修飾ドメイン名と見なさないため、同じオリジン テストに失敗します。他の理由は、ある時点で app.somesite.dev から何かを取得していて、ある時点で「dev」にリクエストを送信している可能性があります

サーバーは何を送信するかは気にしません。すべてが同じホストから送信されていると信じるには、ブラウザーをだます必要があります。

  1. hostsファイルの「dev」をdev.example.com 127.0.0.1に置き換えます
  2. どのサーバーからのものであっても、Apache プロキシから送信されるすべてのものが dev.example.com のみを参照するようにします。
  3. コードでは dev.example.com のみを使用してください

他のすべてが失敗した場合は、HTTP ヘッダー 'Access-Control-Allow-Origin: *' を追加して任意のオリジンを許可できますが、開発環境以外ではこれを使用しません。

PS。example.com:80 から javascript を取得したとしても、その javascript は example.com:443 を呼び出すことさえできません。

于 2013-11-10T20:29:55.283 に答える
0

127.0.0.1 では、html コードは次のようになります。

$.ajax({
    url: "http://127.0.0.1/a/w/currencies",
    type: "GET",
    dataType: "json",
    data: {
    },
    success: function(data){
        console.log(data);
    }
}); 

127.0.0.1 では、Apache conf は次のようになります。

...

<VirtualHost dev:8080>
            ...
            ProxyPass / https://app.somesite.com:5002/
            ProxyPassReverse / https://app.somesitecom:5002/
            ...
</VirtualHost>

この場合、URL と ajax が同じドメインを使用しているため、ブラウザーはクロスドメインになり ません -proxy ですが、私にはうまくいくようです。試してみてください:)

于 2016-12-09T13:43:35.300 に答える