You'll need to use mod_rewrite and a condition (RewriteCond
) that matches against the QUERY_STRING
server variable.
Try the following in your root .htaccess
file above any existing mod_rewrite directives.
RewriteEngine On
# PART 1 : Redirect old category URLs
RewriteCond %{QUERY_STRING} ^cat=(\w+)
RewriteRule ^portfolio/category$ /projecten/%1? [R=302,L]
# PART 2 : Redirect other old URLs
RewriteCond %{QUERY_STRING} ^s=(pagename-\w{3}-\w{3})
RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L]
This assumes that the xxx
in pagename-xxx-xxx
are 3 literal word characters (ie. a-z
, A-Z
, 0-9
or _
).
UPDATE#1: The trailing ?
on the RewriteRule
substitution is necessary in order to remove the query string from the target. Or, use the QSD
flag on Apache 2.4+.
Change the 302
(temporary) redirect to 301
(permanent) when you are sure it's working OK. 301 redirects are cached by the browser, which can make testing problematic.
UPDATE#2: With respect to the updated URL in "PART 2", try the following instead:
# PART 2 : Redirect other old URLs
# To essentially remove the date prefix, eg. "YYYY-MM-DD-"
RewriteCond %{QUERY_STRING} ^s=/d{4}-/d{2}-/d{2}-(.+)
RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L]
^s=[0-9{4}]+-(.+?)/?[0-9{2}]+-(.+?)/?[0-9{2}]+-(.+?)/?(.*)$
This is a bit of a mash, but also looks overly complex for what you are trying to achieve? For instance, why do you need to match an optional slash (ie. /?
)? Your example URL does not contain any slashes?
A regex pattern such as [0-9{4}]+
isn't doing what you think it's doing. This would match any of the characters 0123456789{}
1 or more times. What you seem to be trying to do is to match exactly 4 digits. eg. [0-9]{4}
(which is the same as /d{4}
, using a shorthand character class).