it-swarm.com.de

Senden einer Umleitung in der Tomcat-Webanwendung hinter einem Apache 2-Proxy (mod_proxy)

Ich habe eine Webanwendung für Tomcat http://localhost:8080/WebApp/

Ich habe Apache 2 (mod_proy) so konfiguriert, dass die Webanwendung direkt mit localhost mit out-Port und -Name erreichbar ist: beispiels http://localhost

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

Die index.html wird korrekt in http://localhost. Angezeigt. Wenn jedoch ein Servlet umleitet:

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

und ich benutze die URL http://localhost/login - ich werde zu http://localhost/WebApp/a.html weitergeleitet

Wie bekomme ich die korrekte Weiterleitung zu http://localhost/a.html?

14
Mahe

Dank Stuart und seinem Link zu diesem Blog fand ich eine Lösung: Reverse Proxying Tomcat-Webanwendungen hinter Apache

Lösung: ProxyPreserveHost muss ausgeschaltet sein!

Grund: Wenn es eingeschaltet ist, enthalten die vom Proxy-Backend zurückgegebenen Antwortheader "localhost" oder die reale Domäne ohne Portnummer (oder 80). Das ProxyPassReverse-Muster stimmt also nicht überein (aufgrund des anderen Ports und wenn ein anderer Domänenname verwendet wird, stimmt auch der Domänenname nicht überein).

Config: 

<VirtualHost localhost:80>

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

</VirtualHost>

Dies funktioniert jedoch nur über http, nicht über ajp (ich weiß nicht warum). Wenn Sie ajp dennoch verwenden möchten, können Sie die folgende Problemumgehung verwenden: Lassen Sie Apache nach einer falschen Weiterleitung eine weitere Umleitung durchführen:

<VirtualHost localhost:80>

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

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

</VirtualHost>

Die ProxyPass /WebApp !-Direktive wird benötigt, um den Pfad von der weiteren Verarbeitung in mod_proxy auszuschließen (da Proxy-Direktiven vor Redirect-Direktiven ausgewertet werden).

Dann leiten die Anweisungen von RedirectMatch alles um, das mit /WebApp/... bzw. /WebApp angegeben ist, an die URL ohne /WebApp am Anfang.

Der einzige Nachteil ist, dass Sie in Ihrer Webanwendung keinen Unterordner namens WebApp haben dürfen

14
Mahe

Ich hatte auch dieses Problem und habe einige Zeit damit verbracht. Ich glaube, wenn Sie Ihre Apache-HTTPd-Konfiguration folgendermaßen ändern, funktioniert Ihre Umleitung:

<VirtualHost localhost:80>
    ProxyPreserveHost On

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

    ProxyPassReverseCookiePath /WebApp /
</VirtualHost>

Dies liegt daran, dass die Tomcat-Antwortheader die Proxyheader enthalten (d. H. Der Standortheader ist http://localhost/WebApp und nicht http://localhost:8080/WebApp), weil ProxyPreserveHost aktiviert ist.

Als Fußnote: Dies funktioniert auch, wenn Sie den Kontext Ihrer Webapps ändern möchten. Angenommen, Sie möchten den öffentlich sichtbaren Kontext in einen Kontext ändern, können Sie Folgendes verwenden:

<VirtualHost localhost:80>
    ProxyPreserveHost On

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

    ProxyPassReverseCookiePath /WebApp /context
</VirtualHost>

Zu Referenzzwecken fand ich diesen Blogeintrag äußerst hilfreich: Reverse Proxying Tomcat-Webanwendungen hinter Apache

3
Stuart

Verwenden Sie die Weiterleitung anstelle der Weiterleitung

Ich denke, Ihr Problem ist die Verwendung von sendRedirect. Beim Aufruf von sendRedirect wird dem Browser tatsächlich angezeigt, dass die URL umgeleitet wurde. Wenn Sie das ausblenden möchten, müssen Sie die Weiterleitung verwenden. Versuchen Sie dies in Ihrem Servlet anstelle von 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 );
} 

Setzen Sie crossContext = "true" in Ihrer context.xml, damit Sie Anfragen an andere Webanwendungen weiterleiten können. 

<Context crossContext="true" ....../>
0
Usman Mutawakil

Ich hatte das gleiche Problem, als ich versuchte, die Anfrage Apache2 (auf Port 80 ausgeführt) an Tomcat (Anwendungsserver auf Port 8080) umzuleiten.

Dies ist die Konfiguration, die perfekt funktioniert.

Gehen Sie zu /etc/Apache2/sites-available/000-default.conf und fügen Sie die folgende Konfiguration hinzu:

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

Fertig. Gehen Sie jetzt zum Terminal und drücken Sie den folgenden Befehl.

  1. Sudo a2enmod proxy_http (für http-Weiterleitung).
  2. Sudo a2enmod proxy_wstunnel (für die Websocket-Umleitung)
  3. und Sudo service Apache2 restart
  4. führen Sie Ihren Anwendungsserver an Port 8080 aus
0
Manik Maurya

wenn Sie AJP Connector für die Verbindung von Apache2 und Tomcat verwenden, ist dies die perfekte Lösung dafür.

wenn Sie wissen möchten, wie Sie das konfigurieren, sagen Sie mir, ich werde dieses Detail erklären

0
Ramnath