WordPress.org

Make WordPress Core

Changeset 40256


Ignore:
Timestamp:
03/09/17 20:04:17 (4 months ago)
Author:
SergeyBiryukov
Message:

Canonical: Strip trailing punctuation from permalinks.

Props joostdevalk, lancewillett, SergeyBiryukov.
Fixes #20383.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/canonical.php

    r38216 r40256  
    392392    $redirect['path'] = preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path']); 
    393393 
    394     // Remove trailing spaces from the path 
    395     $redirect['path'] = preg_replace( '#(%20| )+$#', '', $redirect['path'] ); 
     394    $punctuation_pattern = implode( '|', array_map( 'preg_quote', array( 
     395        ' ', '%20',       // space 
     396        '!', '%21',       // exclamation mark 
     397        '"', '%22',       // double quote 
     398        "'", '%27',       // single quote 
     399        '(', '%28',       // opening bracket 
     400        ')', '%29',       // closing bracket 
     401        ',', '%2C',       // comma 
     402        '.', '%2E',       // period 
     403        ';', '%3B',       // semicolon 
     404        '{', '%7B',       // opening curly bracket 
     405        '}', '%7D',       // closing curly bracket 
     406        '“', '%E2%80%9C', // opening curly quote 
     407        '”', '%E2%80%9D', // closing curly quote 
     408    ) ) ); 
     409 
     410    // Remove trailing spaces and end punctuation from the path. 
     411    $redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] ); 
    396412 
    397413    if ( !empty( $redirect['query'] ) ) { 
    398         // Remove trailing spaces from certain terminating query string args 
    399         $redirect['query'] = preg_replace( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#', '$1', $redirect['query'] ); 
     414        // Remove trailing spaces and end punctuation from certain terminating query string args. 
     415        $redirect['query'] = preg_replace( "#((p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] ); 
    400416 
    401417        // Clean up empty query strings 
  • trunk/tests/phpunit/tests/canonical/noRewrite.php

    r38398 r40256  
    4747            array( '/?post_type=page&page_id=1', '/?p=1' ), 
    4848 
    49             array( '/?p=358 ', array('url' => '/?p=358',  'qv' => array('p' => '358') ) ), // Trailing spaces 
    50             array( '/?p=358%20', array('url' => '/?p=358',  'qv' => array('p' => '358') ) ), 
     49            // Trailing spaces and punctuation in query string args. 
     50            array( '/?p=358 ',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // space 
     51            array( '/?p=358%20',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded space 
     52            array( '/?p=358!',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // exclamation mark 
     53            array( '/?p=358%21',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded exclamation mark 
     54            array( '/?p=358"',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // double quote 
     55            array( '/?p=358%22',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded double quote 
     56            array( '/?p=358\'',         array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // single quote 
     57            array( '/?p=358%27',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded single quote 
     58            array( '/?p=358(',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // opening bracket 
     59            array( '/?p=358%28',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded opening bracket 
     60            array( '/?p=358)',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // closing bracket 
     61            array( '/?p=358%29',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded closing bracket 
     62            array( '/?p=358,',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // comma 
     63            array( '/?p=358%2C',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded comma 
     64            array( '/?p=358.',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // period 
     65            array( '/?p=358%2E',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded period 
     66            array( '/?p=358;',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // semicolon 
     67            array( '/?p=358%3B',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded semicolon 
     68            array( '/?p=358{',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // opening curly bracket 
     69            array( '/?p=358%7B',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded opening curly bracket 
     70            array( '/?p=358}',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // closing curly bracket 
     71            array( '/?p=358%7D',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded closing curly bracket 
     72            array( '/?p=358“',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // opening curly quote 
     73            array( '/?p=358%E2%80%9C',  array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded opening curly quote 
     74            array( '/?p=358”',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // closing curly quote 
     75            array( '/?p=358%E2%80%9D',  array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded closing curly quote 
     76 
     77            // Trailing spaces and punctuation in permalinks. 
     78            array( '/page/2/ ',         '/page/2/', 20383 ), // space 
     79            array( '/page/2/%20',       '/page/2/', 20383 ), // encoded space 
     80            array( '/page/2/!',         '/page/2/', 20383 ), // exclamation mark 
     81            array( '/page/2/%21',       '/page/2/', 20383 ), // encoded exclamation mark 
     82            array( '/page/2/"',         '/page/2/', 20383 ), // double quote 
     83            array( '/page/2/%22',       '/page/2/', 20383 ), // encoded double quote 
     84            array( '/page/2/\'',        '/page/2/', 20383 ), // single quote 
     85            array( '/page/2/%27',       '/page/2/', 20383 ), // encoded single quote 
     86            array( '/page/2/(',         '/page/2/', 20383 ), // opening bracket 
     87            array( '/page/2/%28',       '/page/2/', 20383 ), // encoded opening bracket 
     88            array( '/page/2/)',         '/page/2/', 20383 ), // closing bracket 
     89            array( '/page/2/%29',       '/page/2/', 20383 ), // encoded closing bracket 
     90            array( '/page/2/,',         '/page/2/', 20383 ), // comma 
     91            array( '/page/2/%2C',       '/page/2/', 20383 ), // encoded comma 
     92            array( '/page/2/.',         '/page/2/', 20383 ), // period 
     93            array( '/page/2/%2E',       '/page/2/', 20383 ), // encoded period 
     94            array( '/page/2/;',         '/page/2/', 20383 ), // semicolon 
     95            array( '/page/2/%3B',       '/page/2/', 20383 ), // encoded semicolon 
     96            array( '/page/2/{',         '/page/2/', 20383 ), // opening curly bracket 
     97            array( '/page/2/%7B',       '/page/2/', 20383 ), // encoded opening curly bracket 
     98            array( '/page/2/}',         '/page/2/', 20383 ), // closing curly bracket 
     99            array( '/page/2/%7D',       '/page/2/', 20383 ), // encoded closing curly bracket 
     100            array( '/page/2/“',         '/page/2/', 20383 ), // opening curly quote 
     101            array( '/page/2/%E2%80%9C', '/page/2/', 20383 ), // encoded opening curly quote 
     102            array( '/page/2/”',         '/page/2/', 20383 ), // closing curly quote 
     103            array( '/page/2/%E2%80%9D', '/page/2/', 20383 ), // encoded closing curly quote 
    51104 
    52105            array( '/?page_id=1', '/?p=1' ), // redirect page_id to p (should cover page_id|p|attachment_id to one another 
     
    55108            array( '/?feed=rss2&p=1', '/?feed=rss2&p=1', 21841 ), 
    56109            array( '/?feed=rss&p=1', '/?feed=rss2&p=1', 24623 ), 
    57  
    58110        ); 
    59111    } 
Note: See TracChangeset for help on using the changeset viewer.