Лучшая практика для перенаправления с одного веб-домена на другой в Grails? - PullRequest
2 голосов
/ 16 августа 2011

В настоящее время я работаю над фильтром в Grails, который позволит мне перенаправлять все входящие запросы на foo.org на одну и ту же подстраницу на foo.com.До сих пор я делал следующее:

 if(!(""+request.requestURL).toLowerCase().startsWith(
             grailsApplication.config.grails.serverURL ))
    {redirect(url:"${grailsApplication.config.grails.serverURL}${request.requestURI}",params:params) }

К сожалению, у меня возникло несколько проблем с этим подходом:

  1. Значение request.requestURI, похоже, ведет себя не так, как ожидалось:вместо того, чтобы давать мне нормальный шаблон "/ [controller] / [action]", как я ожидал, он возвращает что-то вроде: "/grails/[controller]/[action].dispatch".- Есть ли альтернативный способ получения «нормального» URI?(извините, если это тривиально, но я не смог найти его в документации или испытать различные методы, доступные в объекте запроса)
  2. Параметры не передаются в вышеупомянутом перенаправлении.Вероятно, это связано с тем, что я использую параметр «url» в редиректе, который в соответствии с документами предполагается использовать для перенаправлений на абсолютные пути (что опять же заставляет его игнорировать раздел params?).Однако, поскольку я не смогу использовать обычный подход перенаправления (controller: ..., action: ...) при перенаправлении в другой домен, какой подход я мог бы использовать для правильной передачи параметров на подстраницу на foo.com?Рассматриваю решение, в котором я добавлю params вручную через закрытие params.each {}, но разве нет более элегантного решения для этого?
  3. 301 перенаправляет.Поскольку мои перенаправления носят постоянный характер, я хотел бы использовать код состояния 301.Я попытался установить «response.status = 301», но, кажется, игнорируется при использовании метода Grails redirect (...).Кроме того, на grails.org я вижу, что это, по-видимому, представлено в Grails 2.0, но есть ли способ получить это уже в Grails 1.3.7?

1 Ответ

2 голосов
/ 16 августа 2011
  1. Использовать request.forwardURI.

  2. Если вы имели в виду параметры GET, то это должно быть разрешено с использованием вышеуказанного URI?

  3. Я думаю, что переадресация 301 невозможна при использовании классического redirect.Вы можете сделать это с помощью фильтра, подобного этому, что, очевидно, не самый чистый способ:

    def filters = {
        all(controller:'*', action:'*') {
            before = {
                if (request.serverName == "foo.org") {
                    response.setStatus(301);
                    response.setHeader("Location", "http://foo.com" + request.forwardURI)
                    response.flushBuffer()
                    return false; // return false, otherwise request is handled from controller
                }
            }
        }
    }
    
...