ProxyHTMLURLMap は JavaScript ファイルを変更しません

ProxyHTMLURLMap は JavaScript ファイルを変更しません

Apache 2.4.27 をリバース プロキシとして使用していますが、ProxyHTMLURLMap ディレクティブの一部に問題があります。

私はプロキシサーバーそしてバックエンドサーバーはサーバー1

JavaScript フラグメントが HTML と別の JS ファイルに表示されます。ProxyHTMLURLMap は HTML ファイルを誤って変更しますが、JS ファイルは変更しません。

この URLMap を両方の場所に影響を及ぼすように定義するにはどうすればよいでしょうか?

これが私の設定の一部です:

LogLevel warn proxy_html:trace3

<Location "/server1/">
    ProxyPass https://server1:5443/ ping=2
    ProxyPassReverse https://server1/

    ProxyHTMLEnable On
    ProxyHTMLExtended On

    SetOutputFilter INFLATE;proxy-html;DEFLATE

    ProxyHTMLURLMap /rpc/ /server1/rpc/
</Location>

HTML ファイルと JS ファイルの両方に表示される JavaScript フラグメントは次のとおりです。

abc.get({
    url: "/rpc/getdefaultcfg.asp",
    onrcv: function(arg) {
        if (arg.STATUS == 0) {
            default_Lang = WEBVAR_JSONVAR_GETDEFAULTLANG.WEBVAR_STRUCTNAME_GETDEFAULTLANG;
        }
        onload = loadInit();
    }
});

HTMLファイルはProxyServerによって変更されます2回一致する行を次のように更新します。

url: "/server1/server1/rpc/getdefaultcfg.asp",

重複した「server1」に注意してください。なぜ重複しているのでしょうか?

この HTML ファイルには、次の JS ファイルが含まれています。

<script language="Javascript" src="index.js"></script>

ただし、index.js はプロキシ サーバーによって変更されません。次のように変更されません。

url: "/rpc/getdefaultcfg.asp",

なぜ JS ファイルは URLMap ディレクティブによって変更されないのでしょうか? アイデアがあればぜひ教えてください。

参考までに、httpd_access_log ファイルには、以下の 2 行目と 5 行目に 404 エラーが表示されます。

1. 192.1.0.76 - "GET /server1/index.html HTTP/1.1" 200 946
2. 192.1.0.76 - "GET /rpc/getdefaultcfg.asp HTTP/1.1" 404 223
3. 192.1.0.76 - "GET /server1/page/disable_javascript.html HTTP/1.1" 200 212
4. 192.1.0.76 - "GET /server1/page/blank.html HTTP/1.1" 200 -
5. 192.1.0.76 - "GET /server1/server1/rpc/getdefaultcfg.asp HTTP/1.1" 404 126

最後に、proxy_html トレースからの出力は次のとおりです。

[proxy_html:trace3] mod_proxy_html.c(265): [client 192.1.0.76:51880] C: matched /rpc/, substituting /server1/rpc/
[proxy_html:trace3] mod_proxy_html.c(265): [client 192.1.0.76:51880] C: matched /rpc/, substituting /server1/rpc/
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51892] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/login.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51892] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/login.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html

マット。

答え1

ProxyHTMLURLMapディレクティブには、置換に必要な柔軟性が欠けていることがわかりました。代わりに、Substituteディレクティブを使用しました。

関心のある各ファイル タイプで置換が行われるようにするために、まず次のディレクティブを使用しました。

     AddOutputFilterByType SUBSTITUTE text/javascript text/html text/css

次に、多くのディレクティブを使用しましたSubstitute。そのうちの 1 つの例を次に示します。

    # Fixup min.js urlPath() references
    Substitute "s#(urlPath\(\))#$1 + \"$npar/\" #q"

注意すべき点は、各ディレクティブに対してファイル全体がスキャンされるSubstituteので、できるだけ多くの置換を 1 つのファイルに詰め込むようにすることです。たとえば、いくつかのケースをカバーするために正規表現を使用しました。

    Substitute "s#(\"|\')/(api|app|images|source|style)#$1/$npar/$2#q"

ファイルが大きく、個別のSubstituteディレクティブが多数ある場合、パフォーマンスの低下は顕著になります。

マット。

答え2

1 つ終わり、あと 1 つ。質問の 1 つである重複置換の修正方法を発見しました... 簡単に言うと、これはよくありません。

ProxyHTMLEnable On
SetOutputFilter INFLATE;proxy-html;DEFLATE

両方のディレクティブは、proxy-html フィルター プロバイダーを出力フィルター チェーンに挿入します。どうやら、かつては ProxyHTMLEnable が proxy-html を挿入しなかったため、2 行目が必要だったようです。

2 行目を次のように修正すると、重複はなくなります。

ProxyHTMLEnable On
SetOutputFilter INFLATE;DEFLATE

完全を期すと、同等のものは次のようになります。

ProxyHTMLEnable Off
SetOutputFilter INFLATE;proxy-html;DEFLATE

マット。

関連情報