301 redirects for /blog to blog subdomain not working

...do I put it after the # END Wordpress in the htaccess or am I missing something?

No. Any external redirect should come before the # BEGIN WordPress code block. ie. Before WP internally rewrites the request.

If you placed it after the WP code block it will simply be ignored, since WP will have already routed the request.

Otherwise your mod_rewrite redirect looks OK, assuming your old /blog/ URL always has a trailing slash (to the "blog root"), the blog subdomain points to the same place on the filesystem as your main domain and you have already canonicalised the domain (ie. it can only be accessed via the www subdomain).

 Redirect 301 /blog ....

You should avoid mixing RewriteRule (ie. mod_rewrite) and Redirect (ie. mod_alias) directives. Since these two directives belong to different modules they execute at different times during the request and you can end up with confusing conflicts if you are not careful. So, since you are already using mod_rewrite (WordPress directives) then you should stick to using mod_rewrite for any redirects.

It wouldn't matter were you placed the Redirect in your config file - it would still execute after the mod_rewrite directives.


You want something like this using a mod_alias

Redirect permanent /blog http://blog.example.com/

The keyword permanent causes Apache to send an HTTP status of 301 Moved Permanently instead of 302 Found.

To use your method you can try this

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule ^blog/(.*)$ http://blog.example.com/$1 [L,QSA,R=301]

RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteCond %{REQUEST_URI} !^blog/
RewriteRule ^(.*)$ /blog/$1 [L,QSA]