Using regular expression in htaccess for 301 redirects

Zabs picture Zabs · May 21, 2013 · Viewed 22.4k times · Source

I have a Wordpress blog where I am redirecting blog posts from my old blog to my new blog in the format below:

The old blog is called 'News' and the new blog is simply called 'Blog' - both exist on the same domain in a subdirectory as indicated below.

OLD 'News' blog structure

http://www.example.com/news/new-android-os-3431

NEW 'Blog' blog structure

http://www.example.com/blog/new-android-os

Essentially this redirect needs to do 2 things:-

  1. Redirect to 'blog' directory
  2. Retain the post name in the same structure but remove the last set of numbers at the end of the URL

I have around 900+ posts that I need to setup redirects for - I know I could manually add each one in but that would take some time. Could anyone indicate if this could be using an regular expression directly within the htaccess file to minimise this process?

My htaccess currently looks like this:

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

Answer

Jon Lin picture Jon Lin · May 21, 2013

Using mod_alias:

RedirectMatch 301 ^/news/(.+?)(-[0-9]+)?$ /blog/$1

or using mod_rewrite:

RewriteEngine On
RewriteRule ^news/(.+?)(-[0-9]+)?$ /blog/$1 [L,R=301]