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

Posted

技术标签:

【中文标题】reverseProxy:如何更改嵌入的 JavaScript 文件中的内容【英文标题】:reverseProxy: how to change content in embedded JavaScript file 【发布时间】:2017-05-30 09:24:48 【问题描述】:

我使用 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】:

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

您是否在浏览器中验证返回的 Content-Type 与您的过滤器匹配?您指定了一个 Javascript 文件,但过滤了 text/html。 (例如 Chrome:打开开发者工具 > 导航到页面 > 打开网络选项卡 > 单击需要替换的资源 > 在响应标头中查找 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>

【讨论】:

嗨,感谢您的解决方案和有用的 cmets。我的规则中的内容类型是 text/html 的原因是因为它用于更改 html.head.base 标记中的内容。我将建议的配置添加到我的虚拟主机定义中,它就像一个魅力。谢谢! 我还能再问一个问题吗?如果 url 是web.mydomain.com/hello,我的上述规则有效。在这种情况下, html.head.base 标记已按我的预期更改。但是如果请求 url 是 web.mydomain.com/hello/whatever 那么 html.head.base 标签包含原始内容。它没有改变。为什么? 您究竟在配置中添加了什么? Location 指令将其包含的配置指令的范围限制为以 Location 之后的路径开头的 URL。因此,如果第二个 URL 不同,那将是有意义的。如果不是,我不确定发生了什么。删除 Location 指令应该可以解决问题,但我推荐它的原因是为了尽量减少我在原始答案中提到的性能损失。 在这里我们讨论了两种不同的想法。我原始帖子中的#Web App 评论下面的配置更改了 html.head.base 标记的内容。如果 url 是 web.mydomain.com/hello 它工作正常但是如果请求 url 是 web.mydomain.com/hello/whatever 那么 html.head.base 标签包含原始内容(hello-world-0.0.7 instread你好)。

以上是关于reverseProxy:如何更改嵌入的 JavaScript 文件中的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何更改嵌入式 Youtube 视频的速度

如何将Word中的嵌入式图片批量更改为非嵌入式?

如何在 MIDI 文件中嵌入控制更改命令

如何在 React 中更改嵌入推文的宽度?

如何更改 PHP 文件中嵌入 HTML 的样式?

Xcode - 我如何以编程方式在容器视图中嵌入/更改视图控制器?