Rack middleware for defining a canonical host name.
Switch branches/tags
Nothing to show
Pull request Compare This branch is 87 commits behind tylerhunt:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Rack Canonical Host

Rack Canonical Host is a bit of Rack middleware that lets you define a single host as the canonical host for your site, and redirect all other hostnames to that canonical host.

In the simplest case, just specify the host name and any requests coming in that aren't for the host example.com will be rewritten with the proper host.

use Rack::CanonicalHost, 'example.com'

You could also define a constant in your environment-specific configuration files to set up a canonical host redirect for only certain environments.

CANONICAL_HOST = 'example.com'

Then, you can set up the middle are like this.

use Rack::CanonicalHost, CANONICAL_HOST if defined?(CANONICAL_HOST)

If you'd like the middleware to ignore certain hosts, you can pass in the :ignore_hosts options like so:

use Rack::CanonicalHost, CANONICAL_HOST, { ignored_hosts: ["api.example.com"] }

In this case, requests with the server names example.com and api.example.com will not be redirected

Alternatively, you can pass a block whose return value will be used to set the canonical host.

use Rack::CanonicalHost do
  case ENV['RACK_ENV'].to_sym
    when :staging then 'example.com'
    when :production then 'staging.example.com'

Rails 3

Using Rack::CanonicalHost in your rails 3 app is pretty straight forward.

Open up your gemfile and add the following. Then 'bundle install' to get the gem.

gem 'rack-canonical-host'

Then create the file config/initializers/canonical_host.rb to capture the configuration block.

Rails.application.config.middleware.use Rack::CanonicalHost do
  case ENV['RACK_ENV'].to_sym
    when :development then 'localhost.example.com' #make sure this is in your dns or /etc/hosts file
    when :staging then 'staging.example.com'
    when :production then 'www.example.com'

You will need to restart your server to have this change take effect.

Copyright © 2009 Tyler Hunt. See LICENSE for details.