301 redirects for /blog to blog subdomain not working

301 redirects for /blog to blog subdomain not working - .htaccess files are extremely useful in many cases for users who either do not have root permissions or for users who simply aren't comfortable in making changes in their web server's configuration file. Trying to debug .htaccess not working isn't always the easiest thing to do, however, hopefully by checking the discuss below mentioned about htaccess, redirects, wordpress, 301-redirect, .htaccess common problems as well as the troubleshooting tips, you'll have a better grasp on what you may have to modify to get your .htaccess file running smoothly.Problem :


I just created a new subdomain for my blog so blog.example.com - it used to be www.example.com/blog so I am now trying to write 301 redirects from all my old /blog posts to the new blog.example.com URLs. I have placed the following code in my htaccess:



RewriteEngine On
RewriteCond %HTTP_HOST ^www.example.com$
RewriteRule ^blog/(.*)$ http://blog.example.com/$1 [L,R=301]


However, do I put it after the # END Wordpress in the htaccess or am I missing something? Where in the htaccess file do I put this code or is it even the correct code?



# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress


OR Do I need to write out



Redirect 301 /blog/example-post http://blog.example.com/example-post


Any help would be appreciated, thanks!


Solution :


...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]


I had same problem, site was very very slow.



Changed [L,R=301] to [R=301,L] and problem solved.


Additionally, if you would like to do some further testing, give the htaccess tester tool a try. It allows you to specify a certain URL as well as the rules you would like to include and then shows which rules were tested, which ones met the criteria, and which ones were executed.

Comments

Popular posts from this blog

Rewrite in Mediawiki, remove index.php, .htaccess

.htaccess rewrite wildcard folder paths from host

Using .htaccess to set a cookie and 301 redirect