grails リソース プラグインを使用して、Amazon CloudFront などのコンテンツ配信ネットワークを介してリソースを提供する場合、ページが HTTP と HTTPS の両方でアクセスされる場合、どのように処理しますか?
CDN ベース URL が HTTP の場合、HTTPS ページは混合コンテンツの警告になります。
私が見る限り、リソース プラグインは 1 つのマッピングのみを許可し、リソース taglib で生成された URI を後処理する方法がわかりません。
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.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
}