Apache-2.2

反向代理中的 Apache URL 重寫

  • April 3, 2019

我在 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>

引用自:https://serverfault.com/questions/551700