![反向代理中的 Apache URL 重写](https://linux22.com/image/620591/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E4%B8%AD%E7%9A%84%20Apache%20URL%20%E9%87%8D%E5%86%99.png)
我在 Karaf 托管的应用程序前面部署了 Apache(Apache 和 Karaf 位于不同的服务器上)。我希望 Apache 充当反向代理,并隐藏部分 URL。
直接从应用服务器获取应用程序登录页面的 URL 是http://app-server:8181/jellyfish
。页面由在 Karaf 中运行的 Jetty 实例提供。当然,这种行为通常会被防火墙阻止,除了反向代理服务器之外。
关闭防火墙后,如果您点击此 URL,Jetty 将加载登录页面。浏览器的地址栏将正确更改为http://app-server:8181/jellyfish/login?0
,一切正常。
我想要的是http://web-server
(即从根目录)映射到应用服务器上的 Jetty,并且应用程序的名称(jellyfish
)被抑制。例如,浏览器将更改为显示http://web-server/login?0
在地址栏中,并且所有后续 URL 和内容都将通过 Web 服务器的域提供,并且不会出现混乱jellyfish
。
我可以让 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
指令,但似乎也无法完全正确。
这是当前配置,已加载到/etc/apache2/sites-available/
Web 服务器上。请注意,有一个本地托管的图像目录。我还保留了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
,我会被重定向到 ,http://web-server/jellyfish/home
但这会出现 404,并显示有关尝试访问的投诉/jellyfish/jellyfish/home
- NB 浏览器的地址栏不包含双重/jellyfish
。
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
而且,如果我访问http://web-server/login
,我会被重定向到 ,http://web-server/jellyfish/login?0
但这会出现 404,并显示有关尝试访问 的投诉/jellyfish/jellyfish/login
。
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
因此,我猜我可能以某种方式两次通过了规则。我对home
第一个示例中 URL 的位来自何处也感到有些困惑。
有人能给我指明正确的方向吗?
谢谢,J。
答案1
这就是我让它工作的方法。除了按照我对原始问题的评论所做的更改外,我还需要从添加尾部斜杠的规则中排除.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>
答案2
你有没有尝试过:
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]