0

企業環境: 私とインターネットの間には、負荷分散されたプロキシがあります。proxypacMSIE 接続設定は、大まかに次のようなファイルを指しています。

function FindProxyForURL(url, host)
{
if ((shExpMatch(host,"intranet1.corp")) || (shExpMatch(host,"intranet2.corp")))
    return "DIRECT";
else
    return "PROXY proxy1.corp:3128; PROXY proxy2.corp:3128";
}

私の質問: プログラム的に、使用しているプロキシをどのように判断できますか? 私はWindowsを使用しています。

4

1 に答える 1

3

サンプル PAC ファイルは、負荷分散用ではなく、フェールオーバー用に構成されています。
つまり、IE は常に最初に「proxy1.corp」を介して接続を試み、失敗した場合は「proxy2.corp」を介して接続を試みます。ここで
読むことができるように、IEは「自動プロキシ結果キャッシュ」を使用することに注意してください。

理論的には、FindProxyForURL() 関数は、オブジェクトが Web ブラウザーによってフェッチされるたびに呼び出されます。ただし、実際には、Microsoft の Internet Explorer には、Microsoft が「自動プロキシ結果キャッシュ」と呼んでいるものがあります。プロキシ HTTP サーバー (FindProxyForURL() 関数への呼び出しの結果を使用するか、または別の方法で配置されます) がオブジェクトを取得するために正常に接続されるたびに、APR キャッシュが更新されてそのペアが含まれるようになります。FindProxyForURL() 関数を呼び出そうとしているときに、Internet Explorer が APR キャッシュに既にリストされているホストを見つけた場合、同じホストに対して FindProxyForURL() 関数を再度呼び出す代わりに、APR キャッシュ エントリにリストされているプロキシ HTTP サーバーを使用します。(APR キャッシュの目的は、JavaScript 関数を実行する必要がある回数を減らすことです。Internet Explorer の APR キャッシュはホスト名によってインデックス化されるため、これは、ホスト名に加えて URL の任意の部分に従って、PAC スクリプトが複数の異なる結果を確実に生成することは不可能であることを意味します。たとえば、1 つのホスト上で URL のパス部分に応じて異なるプロキシ構成を提供することはできません。Internet Explorer の APR キャッシュは、FindProxyForURL() 関数の完全な結果ではなく、プロキシ HTTP サーバーをキャッシュするため、問題が発生した場合でも、あるプロキシ HTTP サーバーから別のプロキシ HTTP サーバーへのフォールバックは発生しません。いくつかのプロキシ HTTP サーバーのリストを返しました。これは、ホスト名に加えて URL の任意の部分に従って、PAC スクリプトが複数の異なる結果を確実に生成することは不可能であることを意味します。たとえば、1 つのホスト上で URL のパス部分に応じて異なるプロキシ構成を提供することはできません。Internet Explorer の APR キャッシュは、FindProxyForURL() 関数の完全な結果ではなく、プロキシ HTTP サーバーをキャッシュするため、問題が発生した場合でも、あるプロキシ HTTP サーバーから別のプロキシ HTTP サーバーへのフォールバックは発生しません。いくつかのプロキシ HTTP サーバーのリストを返しました。これは、ホスト名に加えて URL の任意の部分に従って、PAC スクリプトが複数の異なる結果を確実に生成することは不可能であることを意味します。たとえば、1 つのホスト上で URL のパス部分に応じて異なるプロキシ構成を提供することはできません。Internet Explorer の APR キャッシュは、FindProxyForURL() 関数の完全な結果ではなく、プロキシ HTTP サーバーをキャッシュするため、問題が発生した場合でも、あるプロキシ HTTP サーバーから別のプロキシ HTTP サーバーへのフォールバックは発生しません。いくつかのプロキシ HTTP サーバーのリストを返しました。単一のホスト上の URL のパス部分に従って、異なるプロキシ構成を提供します。Internet Explorer の APR キャッシュは、FindProxyForURL() 関数の完全な結果ではなく、プロキシ HTTP サーバーをキャッシュするため、問題が発生した場合でも、あるプロキシ HTTP サーバーから別のプロキシ HTTP サーバーへのフォールバックは発生しません。いくつかのプロキシ HTTP サーバーのリストを返しました。単一のホスト上の URL のパス部分に従って、異なるプロキシ構成を提供します。Internet Explorer の APR キャッシュは、FindProxyForURL() 関数の完全な結果ではなく、プロキシ HTTP サーバーをキャッシュするため、問題が発生した場合でも、あるプロキシ HTTP サーバーから別のプロキシ HTTP サーバーへのフォールバックは発生しません。いくつかのプロキシ HTTP サーバーのリストを返しました。
Microsoft の KnowledgeBase 記事 #271361 は、これらの問題を要約し、Internet Explorer の APR キャッシュをオフにする方法を説明しています。Microsoft の Internet Explorer も、「悪い」プロキシ HTTP サーバーに関する情報を 30 分間キャッシュします。これは PAC スクリプトには直接関係ありませんが、人々がプロキシ HTTP サーバーをセットアップし、同時に PAC スクリプトを作成しているときにしばしば混乱を引き起こし、プロキシ HTTP サーバーに問題が発生して " bad" が 30 分間続くと、PAC スクリプトの問題と誤診されます。

ロード バランシングに PAC ファイルを使用する場合は、このページでいくつかの例を参照してください。
ただし、2 つのプロキシ "proxy1" と "proxy2" の間で負荷分散が行われている場合でも、使用されるプロキシはリクエストごとに変わる可能性があります。また、常に複数の IE インスタンスをアクティブにしている場合、一部のインスタンスが「proxy1」を使用し、他のインスタンスが「proxy2」を使用している状況が発生する可能性があります。
したがって、あなたの質問に答えるには、1 つの解決策として、HTTP ヘッダー応答の「via」フィールドを確認することが考えられます。たとえば、次の HTML ページについて考えてみます。

<!DOCTYPE html>
<html>
  <head>
    <title>Javascript Proxy Detection</title>
    <script language="javascript">
    function doRequest(url) {
      if (typeof XMLHttpRequest != 'undefined') {
        try {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.open("GET", url, true);
          xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
              document.myForm.txt.value = xmlhttp.getAllResponseHeaders();
            }
          }
          xmlhttp.send(null);
        } catch (e) {
          alert(e.message);
        }
      } else {
        alert('no XMLHttpRequest');
      }
    }
    </script>
  </head>
  <body>
    <form name="myForm">
      <textarea cols="50" rows="10" name="txt"></textarea><br />
      <input type="button" value="Test Proxy" onclick="doRequest(location.href)">
    </form>
  </body>
</html>

直接接続 (プロキシなし) を介してこのページをリクエストし、[プロキシのテスト] ボタンをクリックすると、次のような出力が得られます。

Content-Encoding: gzip
Content-Length: 470
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
Content-Type: text/html
Accept-Ranges: bytes

プロキシ (私の場合は Squid) を介して同じページをリクエストすると、「via」フィールドも取得されます。

Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 470
Content-Type: text/html
X-Cache: MISS from ****
X-Cache-Lookup: HIT from ****:3128
Via: 1.1 ****:3128 (squid/2.7.STABLE9)

したがって、ヘッダーの「via」フィールドの存在を確認することで、次のことを判断できるはずです。

  1. プロキシを使用している場合
  2. 使用したプロキシ

さらなる参考文献:

于 2012-12-08T21:55:40.073 に答える