I am trying to achieve the following:

This URL: www.example.com/wis/9-3/1998/0.general

Redirected to this URL: www.example.com/9440/wis/9-3/1998/0.general

So I'm trying to add this subdirectory to the target URL: /9400/

Also, /0.general changes, so that needs to be obtained from the original URL.

This is what I currently have, but it doesn't work:

RewriteRule ^/wis/9-3/1998/(.*)$ /9400/wis/9-3/1998/$1 [L]
  • 1
    /0.general changes <- Is this a subdirectory or file, and does the format for the name remain consistent (e.g., a digit followed by a period and then a word)? – dan Mar 6 '19 at 4:44
RewriteRule ^/wis/9-3/1998/(.*)$ /9400/wis/9-3/1998/$1 [L]

This won't work in a directory (or .htaccess) context because of the slash prefix on the RewriteRule pattern. In .htaccess only a partial URL-path is matched, which notably does not start with a slash. So, this should be written:

RewriteRule ^wis/9-3/1998/(.*) /9400/wis/9-3/1998/$1 [L]

(The end $ is superfluous since regex is greedy by default.)

Note also that this is an internal rewrite, not an external "redirect", as you've stated in your question. (Although an internal rewrite might well be what you require?)

Note also, @dan's comment above. Generally, the regex should be as specific as possible.

You could also "simplify" the above directive to save repetition:

RewriteRule ^(wis/9-3/1998/.*) /9400/$1 [L]

UPDATE#1: Within my htaccess I have some default wordpress expressions

If this is WordPress the you can't perform this type of internal rewrite in .htaccess - because of the way WordPress routes the URLs (it looks at the requested URL, to the rewritten URL).

However, you can use an external redirect (ie. the URL changes). In which, case this should go at the top of your .htaccess file, before the WordPress front-controller:

RewriteRule ^(wis/9-3/1998/.*) /9400/$1 [R,L]

Note the addition of the R flag. (This is a temporary 302 redirect.)

UPDATE#2: is there a way to include a range where 1998 is located. Let's say from 1998 to 2005

Regex is not very good for doing "ranges", however, since you have a fairly limited range you can use alternation and include each possible value: 1998, 1999, 2000, etc.:

RewriteRule ^(wis/9-3/(?:1998|1999|2000|2001|2003|2003|2004|2005)/.*) /9400/$1 [R,L]
| improve this answer | |
  • I tried out both of above solutions and it didn't work. Within my htaccess I have some default wordpress expressions and I start the file with RewriteEngine On – jcmaad Mar 6 '19 at 16:20
  • "I have some default wordpress expressions" - Ah, if this is WordPress then you can't use .htaccess to rewrite the URL in this way (because of the way WP routes URLs) - you need to do this in WordPress itself. However, you can use a redirect - is a redirect what you require? I'll update my answer... – MrWhite Mar 6 '19 at 16:26
  • After reading up on 301 vs 302, I rather have 301 since the redirect is permanent. Do I amend your answer to RewriteRule ^(wis/9-3/1998/.*) /9400/$1 [R=301,L] ? – jcmaad Mar 6 '19 at 16:42
  • Yes, that's correct. But you should always test with a temporary redirect first to avoid caching issues. – MrWhite Mar 6 '19 at 16:44
  • excellent, thank you. is there a way to include a range where 1998 is located. Let's say from 1998 to 2005. – jcmaad Mar 6 '19 at 16:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.