Обратите внимание на ключевые отличия от других решений в решениях ниже:
- Использование request.domain вместо request.host, поскольку большинство хостов ресурсов будут не assets0.www.domain.com, а наоборот assets0.domain.com
- Использование source.dash и modulo гарантирует, что один и тот же ресурс обслуживается с одного и того же сервера активов. Это ключ к производительности страницы.
- Фильтрация по типу актива / пути.
Я всегда делал что-то вроде этого:
config.action_controller.asset_host = Proc.new { |source, request|
"http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 3)}." << request.domain # cdn0-3.domain.com
}
Или, если у вас есть несколько хостов активов / cdn, вы можете решить, какие ресурсы обслуживать с какого хоста, вот так:
config.action_controller.asset_host = Proc.new { |source, request|
case source
when /^\/images/
"http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 2)}." << request.domain # cdn0-1.domain.com
when /^\/javascripts/, /^\/stylesheets/
"http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 2) + 2}." << request.domain # cdn2-3.domain.com
else
"http#{request.ssl? ? 's' : ''}://cdn4." << request.domain # cdn4.domain.com
end
}
Надеюсь, это поможет!