reverseProxy:如何更改嵌入式 JavaScript 文件中的内容
reverseProxy: how to change content in embedded JavaScript file
我使用 Apache HTTP 2.4 作为反向代理。除了一件事,我的配置工作正常:
- 我想更改嵌入式 JavaScript 文件中的字符串内容 (url)
这是我的实际虚拟主机配置:
<VirtualHost web.mydomain.com:80>
ServerName web.mydomain.com
ServerAlias web.mydomain.com
DocumentRoot "..."
...
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ [R=200,L]
#Options -Indexes
#ProxyRequests On
#ProxyPreserveHost Off
# Web App
ProxyPass /hello http://middleware.mydomain.com:8082/hello-world-0.0.7
ProxyPassReverse /hello http://middleware.mydomain.com:8082/hello-world-0.0.7
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|hello-world-0.0.7|hello|ni"
</VirtualHost>
你能帮帮我吗?
通常,您应该能够在您的应用程序服务器中配置外部 URL,从而无需在您的 Apache 服务器中进行替换。这样配置效率会更高
您是否在浏览器中验证返回的 Content-Type 与您的过滤器匹配?您指定了一个 Javascript 文件,但过滤了 text/html。 (例如 Chrome:打开开发人员工具 > 导航到页面 > 打开网络选项卡 > 单击需要替换的资源 > 在响应 header 中查找 Content-Type header秒)。 Content-Type header 应该符合您的过滤器。
如果仍然不起作用,可能是应用程序服务器 returns 压缩了内容(检查 Content-Encoding:响应 headers 中的 gzip)。在那种情况下,替换不起作用是有道理的。
要解决这个问题,请在 Apache 配置中添加以下指令:
RequestHeader unset Accept-Encoding
请注意,这会导致性能下降,因为需要通过网络发送更多数据。我不会在生产环境中推荐这个解决方案,因为它适用于当前虚拟主机的所有请求。如果您只需要对单个文件使用替换,我建议将 AddOutputFilterByType、Substitute 和 RequestHeader 指令包装在一个块中,这样 Apache 只会为该文件做额外的工作:
<Location "/hello/path/to/your/javascript/file.js">
RequestHeader unset Accept-Encoding
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|hello-world-0.0.7|hello|ni"
</Location>
我使用 Apache HTTP 2.4 作为反向代理。除了一件事,我的配置工作正常:
- 我想更改嵌入式 JavaScript 文件中的字符串内容 (url)
这是我的实际虚拟主机配置:
<VirtualHost web.mydomain.com:80>
ServerName web.mydomain.com
ServerAlias web.mydomain.com
DocumentRoot "..."
...
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ [R=200,L]
#Options -Indexes
#ProxyRequests On
#ProxyPreserveHost Off
# Web App
ProxyPass /hello http://middleware.mydomain.com:8082/hello-world-0.0.7
ProxyPassReverse /hello http://middleware.mydomain.com:8082/hello-world-0.0.7
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|hello-world-0.0.7|hello|ni"
</VirtualHost>
你能帮帮我吗?
通常,您应该能够在您的应用程序服务器中配置外部 URL,从而无需在您的 Apache 服务器中进行替换。这样配置效率会更高
您是否在浏览器中验证返回的 Content-Type 与您的过滤器匹配?您指定了一个 Javascript 文件,但过滤了 text/html。 (例如 Chrome:打开开发人员工具 > 导航到页面 > 打开网络选项卡 > 单击需要替换的资源 > 在响应 header 中查找 Content-Type header秒)。 Content-Type header 应该符合您的过滤器。
如果仍然不起作用,可能是应用程序服务器 returns 压缩了内容(检查 Content-Encoding:响应 headers 中的 gzip)。在那种情况下,替换不起作用是有道理的。
要解决这个问题,请在 Apache 配置中添加以下指令:
RequestHeader unset Accept-Encoding
请注意,这会导致性能下降,因为需要通过网络发送更多数据。我不会在生产环境中推荐这个解决方案,因为它适用于当前虚拟主机的所有请求。如果您只需要对单个文件使用替换,我建议将 AddOutputFilterByType、Substitute 和 RequestHeader 指令包装在一个块中,这样 Apache 只会为该文件做额外的工作:
<Location "/hello/path/to/your/javascript/file.js">
RequestHeader unset Accept-Encoding
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|hello-world-0.0.7|hello|ni"
</Location>