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>
你好,谢谢你的解决方案和有用的评论。我规则中的内容类型为text/html的原因是因为它用于更改html.head.base标记中的内容。我将建议的配置添加到我的虚拟主机定义中,它的功能就像一个魅力。谢谢! – zappee
我还有一个问题吗?我的规则上面的作品,如果URL是http://web.mydomain.com/hello/。在那种情况下,html.head.base标记已经改变了,如我所料。但是,如果请求url是http://web.mydomain.com/hello/whatever那么html.head.base标记包含原始内容。它没有改变。为什么? – zappee
你刚刚把你的配置放到了什么位置? Location-directive将其包含的配置指令的范围限制为以位置之后的路径开头的URL。所以,如果第二个网址不同,那么这是有道理的。如果不是,我不确定发生了什么事。 删除Location指令应该可以解决问题,但我推荐它的原因是为了尽量减少我在原始答案中提到的性能损失。 – oneton