Skip to content

Instantly share code, notes, and snippets.

@ntlk
Forked from brookr/config.ru
Last active December 11, 2015 07:09
Show Gist options
  • Save ntlk/4564306 to your computer and use it in GitHub Desktop.
Save ntlk/4564306 to your computer and use it in GitHub Desktop.
Run any site on pow instead of apache
# config.ru for Pow + Wordpress, based on http://stuff-things.net/2011/05/16/legacy-development-with-pow/
# added hackery to work around wordpress issues - Patrick Anderson (patrick@trinity-ai.com)
# clearly this could be cleaner, but it does work
require 'rack'
require 'rack-legacy'
require 'rack-rewrite'
# patch Php from rack-legacy to substitute the original request so
# WP's redirect_canonical doesn't do an infinite redirect of /
module Rack
  module Legacy
    class Php
      def run(env, path)
        
        config = {'cgi.force_redirect' => 0}
        config.merge! HtAccess.merge_all(path, public_dir) if @htaccess_enabled
        config = config.collect {|(key, value)| "#{key}=#{value}"}
        config.collect! {|kv| ['-d', kv]}
        
        script, info = *path_parts(path)
        env['SCRIPT_FILENAME'] = script
        env['SCRIPT_NAME'] = strip_public script
        env['PATH_INFO'] = info
        env['REQUEST_URI'] = strip_public path
        env['REQUEST_URI'] = env['POW_ORIGINAL_REQUEST'] unless env['POW_ORIGINAL_REQUEST'].nil?
        
        super env, @php_exe, *config.flatten
      end
    end
  end
end
INDEXES = ['index.html','index.php', 'index.cgi']
use Rack::Rewrite do
  # redirect /foo to /foo/ - emulate the canonical WP .htaccess rewrites
  r301 %r{(^.*/[\w\-_]+$)}, '$1/'
  rewrite %r{(.*/$)}, lambda {|match, rack_env|
    rack_env['POW_ORIGINAL_REQUEST'] = rack_env['PATH_INFO']
    if !File.exists?(File.join(Dir.getwd, rack_env['PATH_INFO']))
      return '/index.php'
    end
    INDEXES.each do |index|
      if File.exists?(File.join(Dir.getwd, rack_env['PATH_INFO'], index))
        return File.join(rack_env['PATH_INFO'], index)
      end
    end
    rack_env['PATH_INFO']
  }
  # also rewrite /?p=1 type requests
  rewrite %r{(.*/\?.*$)}, lambda {|match, rack_env|
    rack_env['POW_ORIGINAL_REQUEST'] = rack_env['PATH_INFO']
    query = match[1].split('?').last
    if !File.exists?(File.join(Dir.getwd, rack_env['PATH_INFO']))
      return '/index.php?' + query
    end
    INDEXES.each do |index|
      if File.exists?(File.join(Dir.getwd, rack_env['PATH_INFO'], index))
        return File.join(rack_env['PATH_INFO'], index) + '?' + query
      end
    end
    rack_env['PATH_INFO'] + '?' + query
  }
end
use Rack::Legacy::Php, Dir.getwd
use Rack::Legacy::Cgi, Dir.getwd
run Rack::File.new Dir.getwd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment