2012-03-01 2 views
0

내 사이트에는 'http://someRandomUsername.mysite.com'과 같은 url이 있습니다. 때때로 사용자는 'http://www.someRandomeUsername.mysite.com'과 같은 URL을 시도합니다. 이 부분을 처리하기 위해 내 URL 매핑에 논리를 사용하고 싶습니다. 내가 사용하거나 불필요한 www를하지 않고 페이지를 쳤을 때 아래의 매핑으로 , 내가 얻을 :Grails의 로직 블록 URL 매핑

2012-03-01 14 : 52 :. 16014 [HTTP-8080-5] 오류를 [로컬 호스트] [/ ambit] - 페이지 꾸미기 중에 처리되지 않은 예외가 발생했습니다. java.lang.IllegalArgumentException : URL 매핑은 컨트롤러 또는 뷰 이름을 제공해야합니다!

어떤 방법을 생각 하나? 매핑은 다음과 같습니다.

감사합니다. DmitryB 말한 것처럼 제이슨

정적 매핑 = {

  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

+0

여기서 Apache가 사용되지 않습니다. – Jason

답변

1

는 솔직히,이 작업을 수행하는 가장 좋은 방법은 IIS, 아파치, 또는 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