Логический блок в Grails URLMappings

У моего сайта есть такие URL-адреса, как «http://someRandomUsername.mysite.com». Иногда пользователи пытаются использовать такие URL-адреса, как «http://www.someRandomeUsername.mysite.com». Я хотел бы иметь некоторую логику в моих сопоставлениях URL-адресов, чтобы справиться с этим. С приведенными ниже сопоставлениями, когда я попадаю на страницу, с ненужным www или без него, я получаю:

2012-03-01 14:52:16,014 [http-8080-5] ОШИБКА [localhost].[/ambit] — Необработанное исключение возникло при оформлении страницы сопоставить!

Любая идея, как это сделать? Отображение ниже.

Спасибо! Джейсон

статические отображения = {

         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
}

person Jason    schedule 01.03.2012    source источник
comment
Холли макароны! зачем это нужно? почему бы не делегировать перенаправление/перезапись URL на Apache?   -  person dbrin    schedule 02.03.2012
comment
Апач здесь не используется.   -  person Jason    schedule 02.03.2012


Ответы (1)


Честно говоря, как сказал DmitryB, лучший способ сделать это — через веб-сервер, будь то 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
        }
      }
    }
  }
}

Это должно сработать.

person GVdP    schedule 02.03.2012