2013-08-20 40 views
13

http://localhost:8080/WebApp/發送重定向在後面的Apache 2代理(mod_proxy的)Tomcat Web應用程序

我已configrued的Apache 2(mod_proy)在Tomcat Web應用程序,使Web應用程序是通過了本地主機直接訪問端口和名稱:例如http://localhost

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

被正確顯示在http://localhost中的index.html。 但是,如果一個servlet重定向:

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

我用的是URL http://localhost/login - 我重定向到http://localhost/WebApp/a.html

我如何得到正確的重定向到http://localhost/a.html

+0

你需要部署你的應用程序以root身份運行應用程序服務器。我在下面添加了如何操作。 –

回答

12

由於斯圖爾特和他的連結此博客,我發現了一個解決方案: Reverse Proxying Tomcat Web Applications Behind Apache

解決方案:ProxyPreserveHost必須關閉!

原因:如果打開,代理後端返回的響應頭將包含「localhost」或沒有端口號(或80)的真實域。所以ProxyPassReverse模式不匹配(因爲端口不同,如果使用其他域名,域名也不匹配)。

配置:

<VirtualHost localhost:80> 

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

</VirtualHost> 

但這隻能通過HTTP,而不是通過AJP(我不知道爲什麼)。 如果你仍然想使用AJP,你可以使用以下解決方法 - 讓阿帕奇做錯誤的重定向陸續重定向:

<VirtualHost localhost:80> 

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

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

</VirtualHost> 

排除在mod_proxy的進一步處理路徑是需要的ProxyPass /WebApp !指令(因爲代理指令在重定向指令之前被評估)

然後RedirectMatch指令將所有分別爲/WebApp/.../WebApp的所有內容重定向到開始時沒有/WebApp的URL。

唯一的缺點是,你必須沒有在你的web應用

0

你有使用AJP Connector來連接apache2的& tomcat,它將是完美的解決方案。

如果你需要如何配置這一點,告訴我,我會解釋這個細節

+0

使用'ProxyPreserveHost在 ProxyPass/ajp:// localhost:8009/MobikatWebApp/ ProxyPassReverse/ajp:// localhost:8009/MobikatWebApp /'它仍然是相同的問題... – Mahe

0

使用轉發,而不是重定向

我覺得你的問題是使用sendRedirect。調用sendRedirect實際上是假設向瀏覽器顯示該URL已被重定向。如果你想隱藏你需要使用轉發。在你的servlet嘗試這個,而不是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); 
} 

在context.xml中設置crossContext =「true」,以便您可以將請求轉發到其他Web應用程序。

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

嗯,這是一個可憐的... 我計劃讓幾個子域名指向不同的網絡應用程序。所以ROOT上下文不是一個選項。 – Mahe

+0

我不明白你的意思是由幾個子域。你的意思是例如'/ login1'重定向到'/ a.html','/ login2'重定向到'/ b.html','/ login3'重定向到'/ c.html',所有被同一個servlet重定向? –

+0

沒有我所描述的問題,只是一個子問題。我有一個Tomcat服務器和幾個應用程序。我現在要在我的服務器上將'app1.domain.net'指向'localhost:8080/app1 /'和'app2.domain.net'到'localhost:8080/app2'。我更喜歡子域名,因爲它使得稍後在多個服務器上分發應用變得更加容易(如果需要) – Mahe

3

命名WebApp任何子文件我也有這個問題,花了一些時間就可以了。我相信,如果你改變你的Apache httpd配置以下您的重定向將工作:

<VirtualHost localhost:80> 
    ProxyPreserveHost On 

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

    ProxyPassReverseCookiePath /WebApp/
</VirtualHost> 

這是因爲tomcat的響應頭就包含這個proxy頭(即Location頭是http://localhost/WebApp而非http://localhost:8080/WebApp),因爲ProxyPreserveHost打開。

作爲一個腳註:這也適用於你想改變你的webapps上下文。假設你想公開可見的上下文切換到上下文時,可以使用以下命令:

<VirtualHost localhost:80> 
    ProxyPreserveHost On 

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

    ProxyPassReverseCookiePath /WebApp /context 
</VirtualHost> 

僅供參考,我發現這個博客帖子非常有幫助:Reverse Proxying Tomcat Web Applications Behind Apache

+0

謝謝,但這並沒有解決問題。但是,該博客文章的鏈接非常有幫助。查看我更新的解決方案 – Mahe

+0

嗨@Mahe,我很高興這有助於您找到解決方案。我認爲這是ProxyPassReverse和ProxyPreserveHost指令作爲反向代理的apache httpd聯機文檔的缺失部分。 Apache httpd經常用作反向代理,它作爲反向代理服務的Web應用通常不在同一臺服務器上。我能找到的所有例子都假設代理和代理機器在同一臺機器上運行。對於查看此帖的任何人,請參閱[apache httpd as reverse proxy]上的文檔(http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#forwardreverse) – Stuart

+0

嘿,感謝腳註改變上下文的web應用程序。它確實有幫助 –

0

我有同樣的問題,而試圖重定向apache2(在端口80上運行)請求到tomcat(運行在端口8080上的應用程序服務器)。

這是完美工作的配置。

轉到/etc/apache2/sites-available/000-default.conf並添加以下配置:

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

完成。 現在轉到終端並點擊以下命令。

  1. sudo a2enmod proxy_http(用於http重定向)。
  2. sudo a2enmod proxy_wstunnel(對於WebSocket的重定向)
  3. sudo service apache2 restart
  4. 端口8080
相關問題