2012-03-01 56 views
0

我的網站有像'http://someRandomUsername.mysite.com'的網址。 有時用戶會嘗試使用像 'http://www.someRandomeUsername.mysite.com'的網址。我想在我的url映射中有一些 邏輯來處理這個問題。 下面時,我打的頁面,有或沒有 不需要WWW的映射,我得到:Grails中的邏輯塊URLMappings

2012-03-01 14:52:16014 [HTTP-8080-5] ERROR [本地主機] [/ ambit] - 裝飾異常時發生頁面 java.lang.IllegalArgumentException:URL映射必須提供一個 控制器或視圖名稱映射到!

任何想法如何做到這一點?映射如下。

謝謝! 傑森

靜態映射= {

  name publicMap: "/$action?/$id?" { 
       def ret = UrlMappings.check(request) 
       controller = ret.controller 
       userName = ret.userName 
     } 
} 

static check = 
{ request -> 
     def tokens = request?.serverName?.split(/\./) as List ?: [] 
     def ret = [controller:'info'] 
     if(tokens.size() > 3 && token[0] == 'www') 
     { 
       ret.userName = tokens[1] 
       ret.controller = 'redirect' 
       ret.action = 'removeWWW' 
     } 
     else if(tokens.size() == 3) 
     { 
       ret.userName = tokens[0] 
       ret.controller = 'info' 
     } 

     return ret 
} 
+0

冬青通心粉!爲什麼這是必要的?爲什麼不將url重定向/重寫委派給Apache? – dbrin 2012-03-01 23:27:46

+0

Apache不在這裏使用。 – Jason 2012-03-01 23:48:01

回答

1

老實說,像DmitryB說,要做到這一點,最好的辦法是通過Web服務器,無論是IIS,Apache的,或Tomcat。

說了這麼多,我覺得在Grails中完成這個的最好方法是使用過濾器。 你可以在你的〜/ conf目錄下創建這樣的事情:

public class StripFilters { 
    def filters = { 
    stripWWWFilter(controller: '*', action: '*') { 
     before = { 
     def tokens = request.serverName.tokenize(/\./) ?: [] 

     if(tokens.size() > 3 && tokens[0] == 'www') { 
      def url = request.request.requestURL.toString().replace('www.', '') 
      redirect([url:url, params: [userName: tokens[1]], permanent: true]) 
      return false 
     } 
     } 
    } 
    } 
} 

這應該做的伎倆。

+0

謝謝,這很好。 – Jason 2012-03-02 14:00:52