在反向代理中重写Apache URL

我在一个Karaf托pipe的应用程序(Apache和Karaf在不同的服务器上)前部署Apache。 我希望Apache可以作为反向代理运行,也可以隐藏部分URL。

直接从应用程序服务器获取应用程序login页面的URL是http://app-server:8181/jellyfish 。 页面由在Karaf内运行的Jetty实例提供服务。 当然,除了反向代理服务器以外,这种行为通常会被防火墙阻止。

在防火墙closures的情况下,如果您点击此URL,Jetty将加载login页面。 浏览器的地址栏正确地更改为http://app-server:8181/jellyfish/login?0 ,一切正常。

我想要的是http://web-server (即从根目录)映射到应用程序服务器上的Jetty与应用程序( jellyfish )的名称压制。 例如,浏览器将更改为在地址栏中显示http://web-server/login?0 ,所有后续的URL和内容将与Web服务器的域一起提供,并且不会出现jellyfish混乱。

我可以使用下面的configuration(snippet)让Apache作为一个简单的反向代理来运行:

 ProxyPass /jellyfish http://app-server:8181/jellyfish ProxyPassReverse / http://app-server:8181/ 

…但这需要浏览器的URL包含jellyfish和去根URL( http://web-server )给出了404 Not Found。

我花了很多时间试图使用mod_rewrite和没有[P]标志来解决这个问题,但没有成功。 然后我尝试了ProxyPassMatch指令,但我似乎无法得到相当正确的。

这是当前的configuration,正如加载到Web服务器上的/etc/apache2/sites-available/ 。 请注意,有一个本地托pipe的图像目录。 我也保留了mod_rewrite代理漏洞保护,并且压制了一些伪造的错误mod_security规则。

 <VirtualHost *:80> ServerAdmin admin@drummer-server ServerName drummer-server ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /images/ "/var/www/images/" RewriteEngine On RewriteCond %{REQUEST_URI} !^$ RewriteCond %{REQUEST_URI} !^/ RewriteRule .* - [R=400,L] ProxyPass /images ! ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1 ProxyPassReverse / http://granny-server:8181/jellyfish ProxyPreserveHost On SecRuleRemoveById 981059 981060 <Directory "/var/www/images"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost> 

如果我去http://web-server ,我会被redirect到http://web-server/jellyfish/home但是这会给404一个关于尝试访问/jellyfish/jellyfish/home的投诉 – 注意浏览器的地址栏不包含双/jellyfish

 HTTP ERROR 404 Problem accessing /jellyfish/jellyfish/home. Reason: Not Found 

而且,如果我去http://web-server/login ,我被redirect到http://web-server/jellyfish/login?0但是这会给404一个关于尝试访问/jellyfish/jellyfish/login

 HTTP ERROR 404 Problem accessing /jellyfish/jellyfish/login. Reason: Not Found 

所以,我猜想我不知怎么两次通过规则。 我也对第一个例子中URL的起始位来自哪里有点困惑。

有人可以指点我吗?

谢谢,J.

这是我得到它的工作。 除了根据我对原始问题的评论所做的更改外,还需要从添加尾部斜线的规则中排除.js和.css。

 <VirtualHost *:80> ServerAdmin admin@localhost ServerName mydomain.com ServerAlias www.mydomain.com ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined RewriteLog ${APACHE_LOG_DIR}/rewrite.log RewriteLogLevel 9 Alias /images/ "/var/www/images/" RewriteEngine On # rewrite rule to prevent proxy exploit RewriteCond %{REQUEST_URI} !^$ RewriteCond %{REQUEST_URI} !^/ RewriteRule .* - [R=400,L] # consolidate non-www requests onto the www subdomain RewriteCond %{HTTP_HOST} ^yourdomain\.com$ RewriteRule ^(.*) http://www.yourdomain.com/$1 [R=301,L] # Add a trailing slash to the URL (ignoring images, CSS and JavaScript) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteCond %{REQUEST_URI} !^/(.*)(.js|.css)$ RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L] # proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/ # suppress mod_security rules that were giving false positives SecRuleRemoveById 981059 981060 <Directory "/var/www/images"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost> 

J.

你有没有尝试过:

 ProxyPassMatch ^/(.*) http://granny-server:8181/$1 ProxyPassReverse / http://granny-server:8181 

甚至更简单:

 ProxyPass / http://granny-server:8181/ ProxyPassReverse / http://granny-server:8181/ 

我写了我如何处理Apache反向代理和Tomcat 在这里如果你想比较/对比你使用什么设置。

您可能需要添加这个以在URL中添加尾部斜线:

 # Settings for adding a trailing slash to the URL RewriteEngine On RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]