gpt4 book ai didi

grails - 如何在 UrlMappings.groovy 中重写 Grails 中的 URI

转载 作者:行者123 更新时间:2023-12-02 05:15:35 24 4
gpt4 key购买 nike

我基本上想在 UrlMappings.groovy 中进行 URL 重写,例如:

"/pub/cdn/$version/**"(uri: request.forwardURI.replaceFirst("/pub/cdn/[0-9]*", ""))

这样请求:

/pub/cdn/1327516405188/css/login.css

例如,将被翻译为:

/css/login.css

这个想法是获取原始 URI 并去掉一些路径,然后传递新的 URI。

但是,使用上面的代码,我收到错误:

>    org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'grailsUrlMappingsHolder': Cannot resolve
> reference to bean 'urlMappingsTargetSource' while setting bean
> property 'targetSource'; nested exception is
> ...
> groovy.lang.MissingPropertyException: No such property: forwardURI for
> class: java.lang.String

这似乎暗示请求对象是一个字符串。有没有办法获取UrlMappings.groovy中的原始URI?

只要新路径是硬编码的,“/old/path”(uri:“/new/path”)方法就可以工作,但我不知道如何将原始请求的路径作为变量访问在 UrlMappings 类中。

附注我尝试让 UrlMappings 调用 Controller :

"/pub/cdn/$version/**" {
controller = "image"
action = "cdnRedirect"
}

在 Controller 中:

def cdnRedirect = {
def newUri = request.forwardURI?.toString().replaceFirst("/pub/cdn/[0-9]*", "")
return redirect(uri: newUri)
}

虽然 Controller 闭包被正确调用,并且 URI 被正确转换,但重定向似乎根本没有执行任何操作。

最佳答案

根据您的示例,在我看来您正在解决错误的问题。这里真正的问题似乎是您正在使用静态内容的相对链接(例如 css/login.css)。当浏览器选择相对链接时,它使用当前 url 来确定文件的路径。

但是,如果您使用 Grails' resource tag ,grails 将生成一个锚定到 URL 根的 URL。例如,您的 css/login.css 链接将变为 /myAppName/css/login.css

用法如下:

<link type="text/css" href="${resource(dir: 'css', file: 'login.css')}" />

这保证了,无论 Controller 、操作或其他 ID 信息如何,CSS 文件的链接始终是正确的。

<小时/>

至于为什么你的UrlMapping不起作用,那是因为它没有被动态处理。它是在应用程序启动期间处理的,因此当时 request 对象甚至不存在。

如果您绝对需要 URL 重写系统,并且使用 Controller 来处理资源对于此目的来说太复杂,我建议将您的 servlet 引擎(即 Tomcat)放在 Apache 后面,并仅使用 mod_rewrite 。然而,如果设计得当,这实际上是不必要的。

<小时/>

编辑

仅供引用,要获得映射的动态控制,请使用 Dynamic Controller and Action Names 中指定的语法。 。但是,这有些限制,您仍然无法使用它来执行重定向。

关于grails - 如何在 UrlMappings.groovy 中重写 Grails 中的 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9010881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com