2013-08-20 22 views
13

Mam aplikacji sieci web na Tomcat http://localhost:8080/WebApp/Wysyłanie przekierowanie w Tomcat aplikacji WWW za Apache 2 proxy (mod_proxy)

I nie configrued Apache 2 (mod_proy) tak, że aplikacja internetowa jest dostępny bezpośrednio przez localhost z obecnie portu i nazwisko: np http://localhost

<VirtualHost localhost:80> 
    ProxyPreserveHost On 
    ProxyPass/http://localhost:8080/WebApp/ 
    ProxyPassReverse/http://localhost:8080/WebApp/ 
</VirtualHost> 

index.html jest pokazany poprawnie na http://localhost. Ale jeśli aplet przekierowania:

@WebServlet(description = "...", urlPatterns = { "/login" }) 
public class LoginServlet extends HttpServlet 
{  
    @Override 
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws IOException 
    { 
     response.sendRedirect("a.html"); 
    } 
} 

i używam URL http://localhost/login - mam przekierowany do http://localhost/WebApp/a.html

Jak uzyskać poprawne przekierowanie do http://localhost/a.html?

+0

Trzeba wdrożyć aplikację jako root. Dodałem, jak to zrobić poniżej. –

Odpowiedz

12

Dzięki Stuart i jego link do tego bloga znalazłem rozwiązanie: Reverse Proxying Tomcat Web Applications Behind Apache

Rozwiązanie: ProxyPreserveHost musi być wyłączony!

Powód: Jeśli jest włączony, nagłówki odpowiedzi zwrócone przez serwer proxy będą zawierać "localhost" lub prawdziwą domenę bez numeru portu (lub 80). Tak więc wzorzec ProxyPassReverse nie pasuje (z powodu innego portu i jeśli używana jest inna nazwa domeny, również nazwa domeny nie będzie zgodna).

Config:

<VirtualHost localhost:80> 

    ProxyPreserveHost Off 
    ProxyPass/http://localhost:8080/WebApp/ 
    ProxyPassReverse/http://localhost:8080/WebApp/ 

</VirtualHost> 

Ale to działa tylko przez http, a nie poprzez AJP (nie wiem dlaczego). Jeśli nadal chcesz korzystać z AJP można użyć następującego obejścia - Niech Apache zrobić kolejny przekierować po złym przekierowaniem:

<VirtualHost localhost:80> 

    ProxyPass /WebApp ! 
    ProxyPass/ajp://localhost:8009/WebApp/ 
    ProxyPassReverse/ajp://localhost:8009/WebApp/ 

    RedirectMatch 301 ^/WebApp/(.*)$ /$1 
    RedirectMatch 301 ^/WebApp$/

</VirtualHost> 

Dyrektywa ProxyPass /WebApp ! wymagające wykluczyć ścieżkę od dalszego przetwarzania w mod_proxy (bo dyrektyw proxy są oceniane przed dyrektywami przekierowania)

Następnie dyrektywy RedirectMatch przekierowują wszystko z podaniem /WebApp/... odpowiednio /WebApp na adres URL bez /WebApp na początku.

Jedyną wadą jest to, że nie musi mieć żadnego sub folder o nazwie WebApp w aplikacji internetowej

0

używasz złącza AJP do podłączenia apache2 & tomcat, będzie to idealne rozwiązanie do tego.

jeśli trzeba, jak skonfigurować to, powiedz mi wyjaśni ten szczegół

+0

Z 'ProxyPreserveHost On ProxyPass/ajp: // localhost: 8009/MobikatWebApp/ ProxyPassReverse/ajp: // localhost: 8009/MobikatWebApp /' nadal jest to ten sam problem ... – Mahe

0

Używaj spedycja zamiast przekierowania

Myślę, że problem jest wykorzystanie sendRedirect. Wywołanie sendRedirect polega na pokazaniu przeglądarce, że adres URL został przekierowany. Jeśli chcesz ukryć, że musisz użyć przekazywania. W swoim serwecie spróbuj tego zamiast sendRedirect.

String servletPath = request.getServletPath(); 
if(servletPath.equals("/app1")){ 
    ServletContext ctx = request.getServletContext().getContext("/app1"); 
    RequestDispatcher dispatcher=ctx.getServletContext().getRequestDispatcher("/app1/app1.html"); // or wherever you actually keep app1.html 
    dispatcher.forward(request, response); 
} 

Wewnątrz pliku context.xml zestaw crossContext = "true", aby można było przekazywać żądania do innych aplikacji internetowych.

<Context crossContext="true" ....../> 
+0

Hm, to szkoda ... Planowałem mieć kilka subdomen wskazujących różne aplikacje internetowe. Zatem kontekst ROOT nie jest opcją. – Mahe

+0

Nie rozumiem, co masz na myśli przez kilka subdomen. Masz na myśli na przykład '/ login1' przekierowuje do'/a.html', '/ login2' przekierowuje do'/b.html', '/ login3' przekierowuje do'/c.html' wszystkie przekierowywane przez ten sam serwlet ? –

+0

Żaden problem, który opisałem, nie stanowi problemu. Mam serwer Tomcat z kilkoma aplikacjami. Teraz chcę, aby 'app1.domain.net' wskazywało na' localhost: 8080/app1/'i' app2.domain.net' na 'localhost: 8080/app2' na moim serwerze. Wolę subdomeny, ponieważ ułatwia to dystrybucję aplikacji później na kilku serwerach (w razie potrzeby). – Mahe

3

miałem też ten problem i spędził trochę czasu na to. Wierzę, że jeśli zmiany konfiguracji apache httpd z następującym swojej przekierowanie będzie działać:

<VirtualHost localhost:80> 
    ProxyPreserveHost On 

    ProxyPass/http://localhost:8080/WebApp/ 
    ProxyPassReverse/http://localhost/WebApp/ 

    ProxyPassReverseCookiePath /WebApp/
</VirtualHost> 

To dlatego, że nagłówki odpowiedzi kocur będzie zawierał nagłówki proxy (czyli nagłówek Lokalizacja jest http://localhost/WebApp zamiast http://localhost:8080/WebApp) ponieważ ProxyPreserveHost jest włączony.

Jako przypis: Działa to również w celu zmiany kontekstu aplikacji internetowej. Powiedzmy, że chciał zmienić publicznie widoczny kontekst kontekście można użyć następujących:

<VirtualHost localhost:80> 
    ProxyPreserveHost On 

    ProxyPass /context/ http://localhost:8080/WebApp/ 
    ProxyPassReverse /context/ http://localhost/WebApp/ 

    ProxyPassReverseCookiePath /WebApp /context 
</VirtualHost> 

Dla porównania, Znalazłem ten blogu niezwykle pomocne: Reverse Proxying Tomcat Web Applications Behind Apache

+0

Dzięki, ale to nie rozwiązało problemu. Ale link do posta na blogu był bardzo pomocny. Zobacz moje zaktualizowane rozwiązanie. – Mahe

+0

Witam w serwisie @Mahe, cieszę się, że pomogło Ci znaleźć rozwiązanie.Myślę, że jest to brakująca część dokumentacji online httpd apache dla ProxyPassReverse i ProxyPreserveHost dyrektyw działających jako odwrotne proxy. Serwer httpd Apache jest często używany jako odwrotny serwer proxy, a aplikacje internetowe, które działają jako odwrotne proxy, często nie znajdują się na tym samym serwerze. Wszystkie przykłady, które mogłem znaleźć, zakładały, że proxy i urządzenia pośredniczące działają na tej samej maszynie. Dla każdego, kto ogląda ten post, przeczytaj dokumentację na [apache httpd jako reverse proxy] (http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#forwardreverse) – Stuart

+0

Hej dzięki za przypis do zmiany kontekstu webapp. to naprawdę pomogło –

0

miałem ten sam problem, gdy próbował przekierować apache2 (działa na porcie 80) żądanie do tomcat (serwer aplikacji działający na porcie 8080).

Jest to konfiguracja, która działa idealnie.

idź do /etc/apache2/sites-available/000-default.conf i dodaj następujący config:

<VirtualHost *:80> 
    # The ServerName directive sets the request scheme, hostname and port that 
    # the server uses to identify itself. This is used when creating 
    # redirection URLs. In the context of virtual hosts, the ServerName 
    # specifies what hostname must appear in the request's Host: header to 
    # match this virtual host. For the default virtual host (this file) this 
    # value is not decisive as it is used as a last resort host regardless. 
    # However, you must set it for any further virtual host explicitly. 
    #ServerName www.example.com 

    # for redirecting the websocket requests 
    ProxyPass /ws ws://localhost:7681/ 
    #ProxyPass /ws ws://localhost:7681/ 

    ProxyPassReverse /ws ws://localhost:7681/ 

    ServerAdmin [email protected] 
    DocumentRoot /var/www/html 

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, 
    # error, crit, alert, emerg. 
    # It is also possible to configure the loglevel for particular 
    # modules, e.g. 
    #LogLevel info ssl:warn 

    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 

    # For most configuration files from conf-available/, which are 
    # enabled or disabled at a global level, it is possible to 
    # include a line for only one particular virtual host. For example the 
    # following line enables the CGI configuration for this host only 
    # after it has been globally disabled with "a2disconf". 
    #Include conf-available/serve-cgi-bin.conf 


# for redirecting the http request 
    ProxyPass /applicationContextUrl       ' http://localhost:8080/applicationContextUrl 

    ProxyPassReverse /applicationContextUrl   http://localhost:8080/applicationContextUrl 

    ProxyPassReverseCookiePath /applicationContextUrl/
    ProxyPassReverseCookieDomain localhost applicationContextUrl 
    ProxyRequests off 
    ProxyTimeout 15 


    ErrorLog ${APACHE_LOG_DIR}/nirad_error.log 
    LogLevel debug 
CustomLog ${APACHE_LOG_DIR}/nirad_access.log combined 
<Proxy *> 
     AddDefaultCharset off 
     Order deny,allow 
     Allow from all 
     #Require all denied 
     Require all granted 
     Require local 

</Proxy> 
</VirtualHost> 

zrobić. Teraz goto terminal i naciśnij następujące polecenie.

  1. sudo a2enmod proxy_http (dla przekierowania http).
  2. sudo a2enmod proxy_wstunnel (dla websocket przekierowania)
  3. i sudo service apache2 restart
  4. uruchomić serwer aplikacji na porcie 8080
Powiązane problemy