反向代理中的 Apache URL 重寫
我在 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
- 注意瀏覽器的地址欄不包含雙精度/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。
這就是我讓它工作的方式。除了根據我對原始問題的評論所做的更改外,我還需要從添加斜杠的規則中排除
.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>