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

问题描述:

我使用Apache HTTP 2.4作为反向代理。我的配置能正常工作,除了网友认为:reverseproxy:如何更改嵌入式JavaScript文件中的内容

  • 我想在一个嵌入的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> 

你能帮我吗?

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

你在浏览器中确认返回的Content-Type与你的过滤器相匹配吗?你指定一个Javascript文件,但是为text/html过滤。 (例如Chrome浏览器:打开开发人员工具>导航到页面>打开网络选项卡>单击需要替换的资源>查找响应头中的Content-Type标头)。 Content-Type标题应与您的过滤器匹配。

如果仍然不起作用,应用程序服务器可能会返回gzip内容(在响应头中检查Content-Encoding:gzip)。在那种情况下,替代是行不通的。

要解决的是,添加以下指令在Apache配置:

RequestHeader unset Accept-Encoding 

请注意,由于需要更多的数据通过网络发送这会导致性能下降。我不会在生产环境中推荐此解决方案,因为它适用于当前虚拟主机的所有请求。如果你只需要使用替代单个文件,我建议包装在一个块中的AddOutputFilterByType,替代和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> 
+0

你好,谢谢你的解决方案和有用的评论。我规则中的内容类型为text/html的原因是因为它用于更改html.head.base标记中的内容。我将建议的配置添加到我的虚拟主机定义中,它的功能就像一个魅力。谢谢! – zappee

+0

我还有一个问题吗?我的规则上面的作品,如果URL是http://web.mydomain.com/hello/。在那种情况下,html.head.base标记已经改变了,如我所料。但是,如果请求url是http://web.mydomain.com/hello/whatever那么html.head.base标记包含原始内容。它没有改变。为什么? – zappee

+0

你刚刚把你的配置放到了什么位置? Location-directive将其包含的配置指令的范围限制为以位置之后的路径开头的URL。所以,如果第二个网址不同,那么这是有道理的。如果不是,我不确定发生了什么事。 删除Location指令应该可以解决问题,但我推荐它的原因是为了尽量减少我在原始答案中提到的性能损失。 – oneton