I have the following 2 redirects active:
/code-examples/(.*)
-> /tutorials/android/$1/
and
/code-examples/android/(.*)
-> /tutorials/android/$1/
The first one has a higher position, so the second will only be executed if the first one didn't apply. This works if there is something in the placeholders, i.e. /code-examples/page1
leads to /tutorials/android/page1
.
The problems occur when the placeholders are empty.
Just /code-examples
or /code-examples/android
WITHOUT the trailing slash leads to 404. With the trailing slash, I can see that it adds a second slash at the end, which results in /tutorials/android//
.
How can I get the redirects to work properly with and without something in the placeholders?
I have the following 2 redirects active:
/code-examples/(.*)
-> /tutorials/android/$1/
and
/code-examples/android/(.*)
-> /tutorials/android/$1/
The first one has a higher position, so the second will only be executed if the first one didn't apply. This works if there is something in the placeholders, i.e. /code-examples/page1
leads to /tutorials/android/page1
.
The problems occur when the placeholders are empty.
Just /code-examples
or /code-examples/android
WITHOUT the trailing slash leads to 404. With the trailing slash, I can see that it adds a second slash at the end, which results in /tutorials/android//
.
How can I get the redirects to work properly with and without something in the placeholders?
Share Improve this question asked Oct 25, 2018 at 9:06 Florian WaltherFlorian Walther 1591 silver badge8 bronze badges 5 |1 Answer
Reset to default 1The problem with your RegEx patterns:
/code-examples/(.*) /code-examples/android/(.*)
is that they only match when the ending slash (
/
) is present in the URL; e.g.:# Example 1: $1 is 'page1' /code-examples/page1 /code-examples/android/page1 # Example 2: $1 is '' (empty) /code-examples/ /code-examples/android/ # Example 3 # No matches because the ending / is not present. /code-examples /code-examples/android
where the "placeholder" (i.e.
(.*)
) matches thepage1
in the first example, and''
(i.e. empty string) in the second example.To make these work:
/code-examples /code-examples/android
you can use
(?:/?(.*)|\b)
instead of/(.*)
, like so:/code-examples(?:/?(.*)|\b) /code-examples/android(?:/?(.*)|\b)
But since you redirect to the same URL (
/tutorials/android/$1/
), you can combine those RegEx patterns like so:/code-examples(?:/android|)(?:/?(.*)|\b)
where
/code-examples(?:/android|)
matches either/code-examples
or/code-examples/android
.
I added the redirects with the Redirection plugin.
I suppose you have something like this on the Tools → Redirection → Redirects page (in wp-admin
):
Now with the combined RegEx pattern, delete the second Redirect and edit the first one like so:
Note: For the Type and Group settings, just use your existing setup.
Resources:
Redirect Regular Expressions: https://redirection.me/support/redirect-regular-expressions/
https://regexr/41vch — for testing the combined RegEx pattern. But note that on RegExr, you need to use
\/
and not just/
. I.e. escape the/
with a\
.
/code-examples(?:/android|)(?:/?(.*)|\b)
And the problem with your REGEX is because it's "requiring" the/
(slash) at the end. Btw, this question would have probably been better asked on Stack Overflow. – Sally CJ Commented Oct 25, 2018 at 9:34