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

时间:2017-01-15 12:36:45

标签: javascript apache virtualhost reverse-proxy httpd.conf

我使用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 ^(.*)$ $1 [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>

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

通常,您应该能够在应用程序服务器中配置外部URL,从而无需在Apache服务器中进行替换。这样的配置会更有效率。

您是否在浏览器中验证了返回的Content-Type与您的过滤器匹配?您指示一个Javascript文件,但过滤text / html。 (例如Chrome:打开开发人员工具&gt;导航到页面&gt;打开网络标签&gt;点击需要替换的资源&gt;在响应标头中查找Content-Type标头)。 Content-Type标头应与您的过滤器匹配。

如果它仍然不起作用,则应用程序服务器可能会返回gzip压缩内容(检查响应头中的Content-Encoding: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>