1

grails リソース プラグインを使用して、Amazon CloudFront などのコンテンツ配信ネットワークを介してリソースを提供する場合、ページが HTTP と HTTPS の両方でアクセスされる場合、どのように処理しますか?

CDN ベース URL が HTTP の場合、HTTPS ページは混合コンテンツの警告になります。

私が見る限り、リソース プラグインは 1 つのマッピングのみを許可し、リソース taglib で生成された URI を後処理する方法がわかりません。

4

2 に答える 2

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]
于 2012-10-12T07:40:57.323 に答える
1

これは、リソース 1.2.1 プラグインに基づく更新バージョンです。このバージョンでは、metaMethod が異なります。また、前のコードはすべてのリソースを CDN バージョンに置き換えました。他の場所 (たとえば、google jquery cdn) から取得したリソースがある場合、前のコードは google cdn を構成からのものに置き換えます。

以前のバージョンも、http から https への移行のみで、その逆はありませんでした。delegate.request.scheme が http の場合、この新しいバージョンは、http cdn エントリの 2 番目の構成パラメーターを使用します。これは、https リクエストにより多くの料金を支払う amazon クラウドフロントなどを使用している場合に便利です。

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
}
于 2014-02-07T15:40:19.563 に答える