Make an existing WordPress blog a subdirectory of a Rails App?

I have a Rails app on Heroku and a separate WordPress blog hosted on GoDaddy. How can I route RailsApp.com/blog to the WordPress, while maintaining it as a subdirectory of the app?

Related posts

Leave a Reply

2 comments

  1. For Rails3.1+ (+Rails4), you should follow these:
    First, Add gem rack-proxy to Gemfile

    gem “rack-proxy”

    Then add file proxy.rb into Rails.root/lib like this:

    require 'rack/proxy'
    class Proxy < Rack::Proxy
      def initialize(app)
        @app = app
      end
      def call(env)
        original_host = env["HTTP_HOST"]
        rewrite_env(env)
        if env["HTTP_HOST"] != original_host
          perform_request(env)
        else
          # just regular
          @app.call(env)
        end
      end
      def rewrite_env(env)
        request = Rack::Request.new(env)
        if request.path =~ /^/blog(/.*)$/
          # enable these code if you set blog as ROOT directory in wordpress folder
          # env['REQUEST_PATH'] = '/'
          # env['ORIGINAL_FULLPATH'] = '/'
          # env['PATH_INFO'] = '/' # set root path request
          env['REQUEST_URI'] = 'http://tinle1201.wordpressdomain.com' # your path
          env["SERVER_PORT"] = 80
          env["HTTP_HOST"] = "tinle1201.wordpressdomain.com" # point to your host
        end
        env
      end
    end*
    

    Register proxy to middleware into config/application.rb:

    require File.expand_path('../boot', __FILE__)
    require 'rails/all'
    # Require the gems listed in Gemfile, including any gems
    # you've limited to :test, :development, or :production.
    Bundler.require(:default, Rails.env)
    module AdultSavings
      class Application < Rails::Application
        config.autoload_paths += %W(#{config.root}/lib)
        config.middleware.use "Proxy"
        # Settings in config/environments/* take precedence over those specified here.
        # Application configuration should go into files in config/initializers
        # -- all .rb files in that directory are automatically loaded.
        # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
        # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
        # config.time_zone = 'Central Time (US & Canada)'
        # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
        # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
        # config.i18n.default_locale = :de
      end
    end*
    

    Add this line into php file wp-config.php:

    define('WP_HOME', 'http://tinle1201.wordpressdomain.com/blog');
    
  2. Rails configuration

    Add to Gemfile:

    gem "rack-reverse-proxy", :require => "rack/reverse_proxy"
    

    Now we want /blog and /blog/ to be directed to the WordPress instance from the Rails app.

    Add this to your config.ru right before you run the app:

    use Rack::ReverseProxy do
      reverse_proxy(/^/blog(/.*)$/,
        'http://CHANGEME.herokuapp.com$1',
        opts = {:preserve_host => true})
    end
    

    In config/routes.rb add a route:

    match "/blog" => redirect("/blog/")