我使用Apache HTTP 2.4作为反向代理。除了一个人认为我的配置工作正常:
这是我的实际虚拟主机配置:
<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>
你能帮我吗?
答案 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>