Estoy usando Apache 2.4.27 como proxy inverso y tengo problemas con algunas de mis directivas ProxyHTMLURLMap.
tengo unservidor proxyy un servidor backend, llamadoservidor 1.
Tengo un fragmento de JavaScript que aparece en un HTML, así como en un archivo JS separado. ProxyHTMLURLMap modifica incorrectamente el archivo HTML y no modifica el archivo JS.
¿Cómo defino este URLMap para que afecte a ambos lugares?
Aquí está mi fragmento de configuración:
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>
El fragmento de JavaScript que aparece tanto en archivos HTML como JS es:
abc.get({
url: "/rpc/getdefaultcfg.asp",
onrcv: function(arg) {
if (arg.STATUS == 0) {
default_Lang = WEBVAR_JSONVAR_GETDEFAULTLANG.WEBVAR_STRUCTNAME_GETDEFAULTLANG;
}
onload = loadInit();
}
});
El archivo HTML es modificado por el ProxyServerdos vecesactualizando la línea coincidente a:
url: "/server1/server1/rpc/getdefaultcfg.asp",
Observe el duplicado "servidor1". ¿Por qué se duplica?
Este archivo HTML incluye el archivo JS de la siguiente manera:
<script language="Javascript" src="index.js"></script>
Sin embargo, el servidor proxy no modifica index.js. Permanece intacto como:
url: "/rpc/getdefaultcfg.asp",
¿Por qué el archivo JS no es afectado por la directiva URLMap? ¡Cualquier idea muy apreciada!
Para su información, el archivo httpd_access_log muestra los errores 404 en las líneas 2 y 5 a continuación:
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
Finalmente, el resultado del seguimiento de 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
Mate.
Respuesta1
Encontré que la ProxyHTMLURLMap
directiva carecía de la flexibilidad que necesitaba con las sustituciones. En lugar de eso utilicé la Substitute
directiva.
Para garantizar que las sustituciones se produjeran en cada uno de los tipos de archivos que me interesaban, primero utilicé la siguiente directiva:
AddOutputFilterByType SUBSTITUTE text/javascript text/html text/css
Luego utilicé muchas Substitute
directivas. Un ejemplo de uno de ellos es:
# Fixup min.js urlPath() references
Substitute "s#(urlPath\(\))#$1 + \"$npar/\" #q"
Una cosa a tener en cuenta es que se analiza todo el archivo para cada Substitute
directiva, así que intente incluir tantas sustituciones como pueda en una. Por ejemplo, utilicé expresiones regulares para cubrir varios casos:
Substitute "s#(\"|\')/(api|app|images|source|style)#$1/$npar/$2#q"
Si tiene un archivo grande y muchas Substitute
directivas individuales, ¡la penalización en el rendimiento es significativa!
Mate.
Respuesta2
Uno menos, uno por irse. Descubrí la solución a una de mis preguntas, sustituciones duplicadas... En resumen, esto es malo:
ProxyHTMLEnable On
SetOutputFilter INFLATE;proxy-html;DEFLATE
Ambas directivas insertan el proveedor de filtro proxy-html en la cadena de filtro de salida. Aparentemente, en un momento, ProxyHTMLEnable no insertó proxy-html, por lo que se necesitaba la segunda línea.
No más duplicados, una vez que corregí la segunda línea para que fuera:
ProxyHTMLEnable On
SetOutputFilter INFLATE;DEFLATE
Para completar, un equivalente sería:
ProxyHTMLEnable Off
SetOutputFilter INFLATE;proxy-html;DEFLATE
Mate.