diff --git a/wp-includes/canonical.php b/wp-includes/canonical.php index 12b2445aa1..03c51f1702 100644 --- a/wp-includes/canonical.php +++ b/wp-includes/canonical.php @@ -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']), '&'); diff --git a/wp-includes/version.php b/wp-includes/version.php index 97974c6c0b..729829a3a8 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -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.