的mod_proxy不显示OpenRefine应用正确

问题描述:

我有OpenRefine(由码头托管web应用程序)上运行:的mod_proxy不显示OpenRefine应用正确

http://127.0.0.1:3333 

,看起来像这样:

Web OK

一切完美的作品。

现在,我想这个隧道通过的Apache2(出于安全和重命名的原因),所以我改变了我的http.conf文件,并修改了它这样的:

ProxyPass /refine http://127.0.0.1:3333 
ProxyPassReverse /refine http://127.0.0.1:3333 

现在,如果我尝试打开网页通过代理,这是我所看到的:

Web Bad

它看起来像所有的动态内容不能正常工作。我该如何解决这个问题?

注:

  • 我确信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记录,应该很容易从这里想象。

+0

这解决了本地的问题,但我想从外部主机访问。我真的没有看到DNS记录是一种解决方案,我的机器已经在端口80和8089上运行了一些服务,这会很麻烦。 但现在我知道什么是失败(绝对路径),以及如何处理它(国防部重写)。谢谢 – Jesus 2014-09-25 08:52:39

+0

VirtualHost的意义在于,您可以在端口80上运行多个服务,让Apache根据请求详细信息处理路由。每个服务都有自己的主机名,并且服务器根据您提供的主机名来决定ProxyPass通过哪个服务来请求您的请求。如果您希望您的服务能够从远程安全地使用,请使用https并将身份验证添加到VirtualHost。我有数十种服务在防火墙后的各种主机上监听各种端口,并且一台Apache服务器位于它们前面,所有服务器都基于VirtualHost管理外部访问者的访问。 – Kingdon 2014-09-25 12:48:15

+1

也设置默认虚拟主机。如果您使用的是Debian或Ubuntu系统,请查看/ etc/apache2/sites-available和sites-enabled – Kingdon 2014-09-25 12:56:05

可以在不使用虚拟主机的情况下使用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服务器属性。