Open
Reported for: WPML SEO 2.1.0
Overview of the issue
When using the Yoast SEO Pro plugin, RegEx redirect rules do not work in the same way across different languages. There is a different behavior for the default language and the second language.
For example, if you create a redirection rule like ^/en/faq/(.+)$ to /en/support/$1, it might not work as expected when trying to access it through http://example.com/en/faq/test/.
Workaround
Option 1
As a quick workaround you can create different rules.
Following the initial example:
- ^/faq/(.+)$ redirects to /support/$1
- ^faq/(.+)$ redirects to /en/support/$1
Option 2
Please, make sure of having a full backup of your site before proceeding.
- Open …/wp-content/plugins/wp-seo-multilingual/classes/class-wpml-wpseo-redirection.php file.
- Look for the line 34.
- Replace this code:
foreach ( $redirections as $redirection ) { if ( $redirection['origin'] === $url || '/' . $redirection['origin'] === $url ) { return true; } }
- With:
foreach ( $redirections as $redirection ) { if($redirection['format'] == 'regex'){ // Ensure $url starts with /, if regex would need to check if string starts with this is needed. if(strpos($url, '/', 0) !== 0){ $url = '/' . $url; } // Lets use ~ as a regex delimiter instead of /, as we are matching a URL. preg_match('~' . $redirection['origin'] . '~', $url, $matches); if(count($matches) > 0){ return true; } } else if($redirection['origin'] === $url || '/' . $redirection['origin'] === $url){ return true; } }