Here's the quirk to mod_rewrite. Unlike most things in Apache, it is
not inherited by default. Instead, the product of any RewriteRule is put on hold by the server while it continues checking the rest of the path to the originally requested file. If it ever meets another htaccess file containing mod_rewrite, the results of any earlier rewriting are simply discarded, as if they had never existed.
You can enable inheriting within a specific htaccess file by adding the line
RewriteOptions inherit
... but you may not want to.
RewriteBase /blog/
The RewriteBase may be the biggest red herring in all of mod_rewrite. It is only applied when the target of a RewriteRule begins with something other than protocol-plus-domain or a directory slash-- in other words never, if you're constructing your rules carefully.
Should I just change the above to:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
</IfModule>
:: shudder ::
I hope that was a typo. You can't have a RewriteCond unless there's a following RewriteRule.
The simplest and safest approach is to take the rules for your blog and shift them to the appropriate part of the main htaccess, replacing
RewriteRule (.*)
with
RewriteRule ^(blog/.*)
so the rules only kick in if the request was for something in the /blog/ directory. (That's assuming /blog/ remains part of the WordPress URL, even if everything else changes.)
And get rid of the <IfModule> envelope. Not its contents, just the envelope itself. This is part of the boilerplate for prepackaged htaccess files-- but if you haven't got mod_rewrite, you wouldn't be here in the first place.