在Grails中从一个Web域重定向到另一个Web域的最佳实践?

时间:2011-08-16 11:14:30

标签: grails http-status-code-301 redirect

我目前正在使用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] / [动作] .dispatch”。 - 是否有另一种获取“普通”URI的方法? (对不起,如果这是微不足道的,但未能在文档中找到它,也不能通过尝试请求对象上的各种方法)。
  2. Params未在上述重定向中传递。这可能是因为我在重定向中使用“url”参数,根据文档应该将其用于重定向到绝对路径(这又会导致它忽略params部分?)。但是,由于在重定向到另一个域时我将无法使用正常的重定向(controller:...,action:...)方法,我可以使用哪种方法将params正确传递到foo上的子页面.com?我正在考虑一个解决方案,我将通过params.each {}闭包手动添加params,但是没有更优雅的解决方案吗?
  3. 301重定向。由于我的重定向是永久性的,我想使用301状态代码。我试图设置“response.status = 301”,但在使用Grails重定向(...)方法时似乎被忽略了。我还可以从grails.org上看到,这似乎是用grails 2.0引入的,但是现在有没有办法在Grails 1.3.7中获得它?

1 个答案:

答案 0 :(得分:2)

  1. 使用request.forwardURI

  2. 如果您的意思是GET参数,那么应该使用上面的URI解决它?

  3. 我认为使用经典redirect无法实现301重定向。您可以在这样的过滤器中执行此操作,这显然不是最干净的方法:

    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
                }
            }
        }
    }