/ 设置 10 秒超时 // 每日统计清 0 runtime_set('todaycomments', 0); runtime_set('todayarticles', 0); runtime_set('todayusers', 0); if ($forumlist) { $fidarr = array(); foreach ($forumlist as $fid => $forum) { $fidarr[] = $forum['fid']; } forum_update($fidarr, array('todayposts' => 0, 'todaythreads' => 0)); } // 清理临时附件 attach_gc(); // 当天24点 $today = strtotime(date('Ymd')) + 86400; runtime_set('cron_2_last_date', $today, TRUE); // 往前推8个小时,尽量保证在前一天 升级过来和采集的数据会很卡 // table_day_cron($time - 8 * 3600); cache_delete('cron_lock_2'); } } } ?>Redirect regex misbehaving when placeholder empty|Concepts Of Algorithm

Redirect regex misbehaving when placeholder empty

admin2025-06-07  7

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
  • Where are these redirects? .htaccess? – Jacob Peattie Commented Oct 25, 2018 at 9:22
  • 2 Your code can be combined: /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
  • Thank you! Will the regex you posted solve my problem? Looks hella complicated – Florian Walther Commented Oct 25, 2018 at 21:19
  • And I added the redirects with the Redirection plugin. I am a noob. – Florian Walther Commented Oct 25, 2018 at 21:19
  • @FlorianWalther Yes, it will. Check my answer and let me know. – Sally CJ Commented Oct 26, 2018 at 3:13
Add a comment  | 

1 Answer 1

Reset to default 1
  • The 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 the page1 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 \.

转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1749231670a317466.html

最新回复(0)