5

I can't get this redirect working... Can someone point me in the right direction please?

On a WordPress site I want to prevent access to all pages that sit beneath a given parent page. All I want people to see is that parent page.

So if example.com/subdomain/parent-page is made up of:

parent-page
parent-page/sub-page-1
parent-page/sub-page-2 
...and so on

I want all matching sub-pages redirecting to example.com/subdomain/parent-page.

My .htaccess file sits in the root folder of example.com/subdomain.

I think I need RedirectMatch for this so I can use regex.

But all my variations of:

RedirectMatch 301 parent-page/?* example.com/subdomain/parent-page

Do not work for one reason or another. The best result I've had is redirecting pages to the parent domain's "page not found" page!

Clearly I'm missing something here?

  • Is /subdomain actually part of the (visible) URL? – MrWhite Jun 23 '16 at 8:48
3

On a WordPress site

WordPress uses mod_rewrite to handle the URL routing (pretty URLs) - which I assume you are using - so you should avoid using a mod_alias redirect (Redirect, RedirectMatch, etc.) in this instance. (Different modules run at different times, regardless of the order of the directives in the .htaccess file, so you can get unexpected results/conflicts. mod_rewrite usually runs before mod_alias.)

In .htaccess it's easy enough to redirect example.com/subdomain/parent-page/<anything>, but if you only want to redirect existing WordPress pages and 404 when that page does not exist then that is more complex and you should probably seek a WP solution, rather than .htaccess.

Try something like the following at the top of your example.com/subdomain/.htaccess file. These directives must come before any existing WordPress routing directives.

RewriteEngine On
RewriteRule ^parent-page/. /subdomain/parent-page [R=302,L]

Change the 302 (temporary) redirect to 301 (permanent) when you are sure it's working OK. (301's are cached by the browser so can make testing problematic.)

Any URL that starts /subdomain/parent-page/<something> will be redirected (regardless of whether that sub-page exists or not). This also helps to avoid a redirect loop.

RewriteEngine only needs to appear once in the .htaccess file - preferably (more logical) at the top.


RedirectMatch 301 parent-page/?* example.com/subdomain/parent-page

Aside... There are a few things wrong here. The regex is not strictly valid. * matches the preceding char 0 or more times (the preceding char is ?, which is itself a meta character). If you are specifying the domain in the target URL then it must be absolute with protocol etc.

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.