當使用grails資源插件通過內容交付網絡(如Amazon CloudFront)爲資源提供服務時,如何處理使用HTTP和HTTPS訪問頁面的情況?Grails資源與內容交付網絡:如何避免混合內容?
如果CDN的基礎URL是HTTP,HTTPS的頁面將導致混合內容的警告。
據我看到的,只有插件資源允許一個單一的映射,我不明白的方式進行後處理的資源的taglib的產生的URI。
當使用grails資源插件通過內容交付網絡(如Amazon CloudFront)爲資源提供服務時,如何處理使用HTTP和HTTPS訪問頁面的情況?Grails資源與內容交付網絡:如何避免混合內容?
如果CDN的基礎URL是HTTP,HTTPS的頁面將導致混合內容的警告。
據我看到的,只有插件資源允許一個單一的映射,我不明白的方式進行後處理的資源的taglib的產生的URI。
這裏是一個基於資源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
}
非常感謝! –
我結束了猴子打補丁的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]
大約只是在做你的資源,HTTPS是什麼? – chrislovecnm
這會增加HTTP頁面加載時間,所以我沒有考慮它。我發現了一個黑客做我想做的事情,我會將它作爲答案發布。 –