内容交付网络的Grails资源:如何避免混合内容?

时间:2012-10-11 13:45:04

标签: grails cdn

使用grails资源插件通过Amazon CloudFront等内容交付网络提供资源时,如何处理使用HTTP和HTTPS访问页面的情况?

如果CDN基本URL是HTTP,则HTTPS页面将导致混合内容警告。

据我所知,资源插件只允许单个映射,我没有看到在资源taglib中对生成的URI进行后处理的方法。

2 个答案:

答案 0 :(得分:2)

我最终在负责查找资源的ResourceTagLib类中修补了该方法。将其添加到BootStrap.init

def originalResolveResourceAndURI = ResourceTagLib.metaClass.getMetaMethod('resolveResourceAndURI', [Object])
ResourceTagLib.metaClass.resolveResourceAndURI = {args ->
    def result = originalResolveResourceAndURI.invoke(delegate, args)
    String resourceUri = result.uri
    if (resourceUri.startsWith('http:') && delegate.request?.scheme == 'https') {
        result.uri = (resourceUri =~ /http:\/\/[^\/]*/).replaceFirst(grailsApplication.config.grails.resources.cdn.https)
    }
    result
}

并在配置中添加属性

grails.resources.cdn.https=[https URL of CDN]

答案 1 :(得分:1)

这是基于资源1.2.1插件的更新版本。 metaMethod在这个版本中有所不同。此外,以前的代码用CDN版本替换了所有资源。如果你有来自其他地方的资源(例如google jquery cdn),之前的代码会将google cdn替换为配置中的那个。

以前的版本也只从http到https,反之亦然。如果delegate.request.scheme是http,则此新版本对http cdn条目使用第二个配置参数。如果您使用像amazon cloudfront这样的地方为https请求支付更多费用,这将非常有用。

def originalResolveResourceAndURI = ResourceTagLib.metaClass.getMetaMethod('resolveLinkUriToUriAndResource', [Object])
ResourceTagLib.metaClass.resolveLinkUriToUriAndResource = {args ->
    def result = originalResolveResourceAndURI.invoke(delegate, args)
    String resourceUri = result.uri

    if (resourceUri.startsWith(grailsApplication.config.grails.resources.cdn.http) && delegate.request?.scheme == 'https') {
        result.uri = (resourceUri =~ /http:\/\/[^\/]*/).replaceFirst(grailsApplication.config.grails.resources.cdn.https)
    }
    else if (resourceUri.startsWith(grailsApplication.config.grails.resources.cdn.https) && delegate.request?.scheme == 'http') {
        result.uri = (resourceUri =~ /https:\/\/[^\/]*/).replaceFirst(grailsApplication.config.grails.resources.cdn.http)
    }
    result
}