2012-03-01 57 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