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 文件中的内容的主要内容,如果未能解决你的问题,请参考以下文章