2011-03-08 24 views
4

我有兩個Jetty AppServers在Apache 2.2反向代理之後運行Grails Web App。 SSL終止由apaches完成,他們將HTTP傳遞給Jetty AppServers。Grails重定向 - 爲什麼它總是絕對的?

當Grails的Web應用程序確實像這樣

redirect(action:'index') 

最終用戶接收與一個完整的URL,這是使用HTTP 一個HTTP 302重定向請求重定向://協議,不HTTPS ://

HTTP/1.1 302 Found 
Date: Tue, 08 Mar 2011 17:50:46 GMT 
Server: Jetty(6.1.17) 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Location: http://hostname.domain/web/?lang=en 

這是煩人的,因爲所有的HTTP請求得到由代理捕獲並重定向到HTTPS請求。所以這是一次不必要的往返。

我看到兩個解決方案:

  1. 的Apache的mod_proxy可以重寫位置的頭部到https://傳遞的響應上給用戶之前。 Location: /web/?lang=en

第一個選項是有點笨,我認爲,正確的:(?能的話)

  • Grails的可能根本就不是重定向時使用絕對路徑?

    你知道如何讓grails發送非絕對重定向頭(理想情況下,不必切換每個重定向以使用uri:)?

    編輯:目前我有以下通過修改響應頭的第一種方法解決方法(a2enmod headers,再加入在<Location>Header edit Location ^http://(.*)$ https://$1)。靈感來自this serverfault post。我仍然想知道爲什麼這是必要的。

  • 回答

    6

    302 redirects are required by the HTTP 1.1 RFC to be absolute,不是相對位置。即使它在某些瀏覽器中運行,那些規則也會超出規範,並且我相信如果您執行了相對網址,某些實現將無法正常工作。

    你看到這個問題的原因是因爲SSL終止發生在apache上,並且apache向Jetty發出了一個vanilla HTTP請求。因此,Jetty獲得了一個vanilla,非HTTPS請求,因此它不知道發送HTTPS響應,而不是常規的HTTP響應。如果您在Jetty中執行SSL終止,則不會有問題(但Jetty在SSL終止時並不那麼好)。

    我們已經在我們的應用程序(apache/HA Proxy-> Tomcat)中處理了這個問題,具有每個環境配置值對應答協議進行硬編碼(無論如何我們需要搗亂url,因爲它是一個多租戶系統有許多潛在的主機名,長篇故事... :),但你的解決方案與Apache的作品。

    +1

    正確,雖然FWIW,我還沒有看到任何瀏覽器無法支持相對URL。我們試圖停止使用IE7 Beta 1,並在第二天恢復更換。 :-) – EricLaw 2011-03-09 06:50:51

    相關問題