的mod_proxy不显示OpenRefine应用正确
我有OpenRefine(由码头托管web应用程序)上运行:的mod_proxy不显示OpenRefine应用正确
http://127.0.0.1:3333
,看起来像这样:
一切完美的作品。
现在,我想这个隧道通过的Apache2(出于安全和重命名的原因),所以我改变了我的http.conf文件,并修改了它这样的:
ProxyPass /refine http://127.0.0.1:3333
ProxyPassReverse /refine http://127.0.0.1:3333
现在,如果我尝试打开网页通过代理,这是我所看到的:
它看起来像所有的动态内容不能正常工作。我该如何解决这个问题?
注:
- 我确信mod_proxy的更新和工作。使用Tomcat的其他webapps进行测试。
您从http://your.server:3333/改变了应用程序位置http://your.server/refine
你可以看到,与,链接例如,href="/resource.css"
将不再是有效的,因为该资源现在已转移到"/refine/resource.css"
。我想如果你仔细研究HTML源代码,你会发现有几十个这样的绝对路径的链接。
该配置将打破任何绝对路径引用。解决此问题的复杂方法称为URL重写,并且有深入的教程介绍如何通过URL重写来设置Mod-Proxy和Reverse。解释起来很复杂,容易做错;而是添加一个VirtualHost,以便绝对路径链接不需要重写。
<VirtualHost *>
ServerName refine
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass/http://127.0.0.1:3333/
ProxyPassReverse/http://127.0.0.1:3333/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
这是不可能的,你会发现任何绝对链接localhost:3333
所以这可能会为你工作。更改您的/etc/hosts
,以便refine
解析为127.0.0.1
,您将成为金牌。您现在可以使用从http://refine/
没有问题的提炼。
127.0.0.1 localhost refine
如果你想能够从外部主机的访问,一个稍微复杂的设置将涉及新的DNS记录,应该很容易从这里想象。
您可以在不使用虚拟主机的情况下使用mod_proxy和OpenRefine。
今天我需要做同样的事情。我有一个SSL门户,用户必须通过该门户进行一些复杂的PKI和LDAP跟踪的验证,并且由于它有权访问某些数据,因此我需要OpenRefine作为后台托管。在这个线程和其他地方给出的这个问题的答案根本是不可接受的,所以我通过了源代码,期望修补这个行为 - 但我没有必要!
我注意到,因为OpenRefine运行了一个WEB-INF目录,它可能是作为一个典型的java web应用程序构建的。当然,当我查看服务器上如何设置上下文时,我在Refine.java中发现了这个问题:
final String contextPath = Configurations.get(“refine.context_path”,“/”);
所以这就是你要做的:
注:StackOverflow上不会让我写的东西看起来像URL,因为我没有任何的声誉在这里。所以当你阅读http:\时,这实际上意味着http://。
1)在refine.ini中,确保JAVA_OPTIONS包含“-Drefine.context_path =/refine”。 (毫无疑问,您将refine.host更改为0.0.0.0而不是127.0.0.1,并且您还设置了refine.headless = true。)现在,当您重新启动OpenRefine时,您将通过http:\ your.refine访问它.server:3333/refine(显然把你的服务器主机名放在那个url中)。
2)现在,举一个简单的例子,我们将把https:\ your.apache.server/refine代理改为http:\ your.refine.server:3333/refine。
在你的httpd配置文件中的一个(也许是为了在/etc/httpd/conf.d一个openrefine.conf)以下行放入该启用的mod_proxy后:
ProxyPass /refine http:\\your.refine.server:3333/refine
ProxyPassReverse /refine http:\\your.refine.server:3333/refine
这里的区别是,OpenRefine是不在全局范围内,所以应用程序的根可以代理。根据上下文的设置,OpenRefine使用绝对路径发出资源请求。因此,如果您不这样做,OpenRefine将使JavaScript文件落在您的代理位置之外,因为此线程中的其他人以前遇到过,
在现实生活中,您可能希望mod_proxy使用负载均衡器多个OpenRefine实例,并且您可能希望将某些逻辑关于哪些用户可以使用此代理隧道。
希望这可以帮助别人!
我还建议您查看也在Refine.java中的未记录的Refine服务器属性。
这解决了本地的问题,但我想从外部主机访问。我真的没有看到DNS记录是一种解决方案,我的机器已经在端口80和8089上运行了一些服务,这会很麻烦。 但现在我知道什么是失败(绝对路径),以及如何处理它(国防部重写)。谢谢 – Jesus 2014-09-25 08:52:39
VirtualHost的意义在于,您可以在端口80上运行多个服务,让Apache根据请求详细信息处理路由。每个服务都有自己的主机名,并且服务器根据您提供的主机名来决定ProxyPass通过哪个服务来请求您的请求。如果您希望您的服务能够从远程安全地使用,请使用https并将身份验证添加到VirtualHost。我有数十种服务在防火墙后的各种主机上监听各种端口,并且一台Apache服务器位于它们前面,所有服务器都基于VirtualHost管理外部访问者的访问。 – Kingdon 2014-09-25 12:48:15
也设置默认虚拟主机。如果您使用的是Debian或Ubuntu系统,请查看/ etc/apache2/sites-available和sites-enabled – Kingdon 2014-09-25 12:56:05