Canonical: Strip trailing punctuation from permalinks.

Previously attempted in [40256], which caused the test for decoded curly quotes to fail in some environments.

`$_SERVER['REQUEST_URI']` contains the encoded URI, so this version removes the failing tests and only checks for encoded curly quotes.

Props joostdevalk, lancewillett, SergeyBiryukov.
Fixes #20383.
Built from https://develop.svn.wordpress.org/trunk@41991


git-svn-id: http://core.svn.wordpress.org/trunk@41825 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Sergey Biryukov 2017-10-24 14:18:48 +00:00
parent bcdedf7f4a
commit 9eb75432b6
2 changed files with 21 additions and 5 deletions

View File

@ -392,12 +392,28 @@ function redirect_canonical( $requested_url = null, $do_redirect = true ) {
// trailing /index.php
$redirect['path'] = preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path']);
// Remove trailing spaces from the path
$redirect['path'] = preg_replace( '#(%20| )+$#', '', $redirect['path'] );
$punctuation_pattern = implode( '|', array_map( 'preg_quote', array(
' ', '%20', // space
'!', '%21', // exclamation mark
'"', '%22', // double quote
"'", '%27', // single quote
'(', '%28', // opening bracket
')', '%29', // closing bracket
',', '%2C', // comma
'.', '%2E', // period
';', '%3B', // semicolon
'{', '%7B', // opening curly bracket
'}', '%7D', // closing curly bracket
'%E2%80%9C', // opening curly quote
'%E2%80%9D', // closing curly quote
) ) );
// Remove trailing spaces and end punctuation from the path.
$redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] );
if ( !empty( $redirect['query'] ) ) {
// Remove trailing spaces from certain terminating query string args
$redirect['query'] = preg_replace( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#', '$1', $redirect['query'] );
// Remove trailing spaces and end punctuation from certain terminating query string args.
$redirect['query'] = preg_replace( "#((p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] );
// Clean up empty query strings
$redirect['query'] = trim(preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query']), '&');

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.9-beta3-41990';
$wp_version = '4.9-beta3-41991';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.