Redirect *.php to clean URL
I think you just need to change your last line to be:
RewriteRule ^(.*)$ /blah/index.php?/$1 [L]
I have no specific experience with CodeIgniter but generally frameworks want to push all requests through a central controller (index.php) and then parse the request's URL from within there.
EDIT: Just updated my answer with the example from here: http://codeigniter.com/wiki/mod_rewrite/, that should be how CodeIgniter wants it.
UPDATE: You should probably duplicate your RewriteConds for the second RewriteRule, they only apply to the first:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.php$ /blah/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blah/index.php/$1 [L]
Thanks @Cryo for his help, this is the fix:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.php$ /blah/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blah/index.php/$1 [L]
What about:
RewriteRule ^(.*)(\.php)?$ /blah/index.php/$1 [L]
and remove the previous line.
Also make sure that /blah/about.php
does not exist.