reverseProxy:如何更改嵌入式 JavaScript 文件中的内容

reverseProxy: how to change content in embedded JavaScript file

我使用 Apache HTTP 2.4 作为反向代理。除了一件事,我的配置工作正常:

这是我的实际虚拟主机配置:

<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>