2012-10-11 60 views
1

當使用grails資源插件通過內容交付網絡(如Amazon CloudFront)爲資源提供服務時,如何處理使用HTTP和HTTPS訪問頁面的情況?Grails資源與內容交付網絡:如何避免混合內容?

如果CDN的基礎URL是HTTP,HTTPS的頁面將導致混合內容的警告。

據我看到的,只有插件資源允許一個單一的映射,我不明白的方式進行後處理的資源的taglib的產生的URI。

+0

大約只是在做你的資源,HTTPS是什麼? – chrislovecnm

+0

這會增加HTTP頁面加載時間,所以我沒有考慮它。我發現了一個黑客做我想做的事情,我會將它作爲答案發布。 –

回答

1

這裏是一個基於資源1.2.1插件的更新版本。 metaMethod在這個版本中是不同的。以前的代碼也用CDN版本替換了所有資源。如果你有其他地方的資源(例如谷歌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 
} 
+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]