Awesome
Sprockets::Redirect
A Rack middleware for Rails >= 3.1.0 with asset pipeline and asset digest enabled. This middleware is used to redirect any request to static asset without a digest to the version with digest in its filename by reading the manifest file generated after you run rake assets:precompile
For example, if a browser is requesting this URL:
http://example.org/assets/application.js
They will get redirected to:
http://example.org/assets/application-faa42cf2fd5db7e7290baa07109bc82b.js
This gem is designed to run on your staging or production environment, where you already precompile all your assets, turn on your asset digest, and turn of asset compilation. This is useful if you're having a static page or E-Mail which refers to static assets in the asset pipeline, which might be impossible and impractical for you to use an URL with a digest in it.
Requirements
- Application running on Ruby on Rails version >= 3.1.0.
- Enable asset digest by setting
config.assets.digest = true
in your production or staging environment configuration file. - Running
rake assets:precompile
to precompile your static assets after deploy to your production or staging server.
Installation
Insert this line into your Gemfile:
group :production, :staging do
gem "sprockets-redirect"
end
Usage
This middleware will be enabled by default if you set config.assets.compile = false
and config.assets.digest = true
in your configuration file. It will automatically retrieve the asset prefix, asset host, and the list of your digests from Rails.
You could also config this middle ware at a class level, or at middleware initialization.
Configuration at class level:
You can set these configurations at your initializer file:
Sprockets::Redirect.enabled = (true|false)
Set this to false
to override the auto detection and turn off this middleware. Default value is true
.
Sprockets::Redirect.manifest = [path to your manifest.yml]
Set this to another YAML file which override Rails' default digests manifest. Default value is nil
.
Sprockets::Redirect.redirect_status = (301|302)
Set this to override the redirection status. By default, this middleware will use 302
status to prevent any proxy server to cache your redirection, as the target might be changed later.
Configuration at class initialization:
These configurations are configured via an option hash:
-
:digests
- Set a hash used for file name lookup. This will be default to Rails' manifest atRails.configuration.assets.digests
. -
:prefix
- Set a path prefix of your assets file. This will be default toRails.configuration.assets.prefix
(usually at/assets
.) -
:manifest
- Set a path to your own manifest file to use for lookup. This will override both:digest
hash andSprockets::Redirect.manifest
setting. -
:asset_host
- Set the name of the host to use when serving assets. This is useful if you want your server to redirect to assets that are hosted on a CDN. You can also passing aProc
object which will be called on every asset requests to determine the host for that request:config.middleware.swap Sprockets::Redirect, Sprockets::Redirect, :asset_host => Proc.new do |request| if request.path =~ /\.min\.(js|css)\z/ "cdn.example.com" end end
You can swap out the middleware inserted automatically by the gem by using config.middleware.swap
in your configuration file:
config.middleware.swap Sprockets::Redirect, Sprockets::Redirect, :manifest => Rails.root.join('assets', 'manifest.yml').to_s
Contributing
If you found any bug or would like to request a feature, please use Github's issue tracker to report them. Pull requests are always welcomed if you also want to help me fix it. Please make sure to include a test to make sure that I don't break it in the future.
Also, you should run appraisal rake
to run the test against multiple versions of Ruby. We're currently testing against latest patch version of Rails 3.1, 3.2, 4.0, 4.1, 4.2, and 5.0.0 beta.
License
This gem is released under MIT license. Please see LICENSE file for more information.
Credit
This gem is maintained by Prem Sichanugrist (@sikachu) and supported by thoughtbot, inc.