これは消毒と関係がありますか? URLパラメータとして文字列を渡す必要があり、その文字列には\ n文字が含まれています。 URLがクライアントに届くと、他のすべてのエンコーディング(スペースは+として表示され、コロンは%3Aとして表示されるなど)が存在しますが、改行は含まれません。
関連するコードは次のとおりです。
wp_redirect("/upload_success?responseMsg=".urlencode($new_body->message));
wp_sanitize_redirect()
関数を見ると、リンク先URLから新しい行が削除されていることがわかります。
https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/pluggable.php#L1249
私の意見では、2つの選択肢があります。
1 - メッセージの新しい行をdiffが許可する一意のcharの組み合わせに変換してから、それらを新しい行に置き換えてからresponseMsg
URLパラメータから文字列を出力します。
2 - これは プラグイン可能な関数です 、あなたはそれをプラグインに入れてあなたのニーズに合うようにそれをカスタマイズすることができます。このようなもの:
if ( !function_exists('wp_redirect') ) :
/**
* Redirects to another page.
*
* Note: wp_redirect() does not exit automatically, and should almost always be
* followed by a call to `exit;`:
*
* wp_redirect( $url );
* exit;
*
* Exiting can also be selectively manipulated by using wp_redirect() as a conditional
* in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} hooks:
*
* if ( wp_redirect( $url ) ) {
* exit;
* }
*
* @since 1.5.1
*
* @global bool $is_IIS
*
* @param string $location The path to redirect to.
* @param int $status Status code to use.
* @return bool False if $location is not provided, true otherwise.
*/
function wp_redirect($location, $status = 302, $strip_new_lines = true) {
global $is_IIS;
/**
* Filters the redirect location.
*
* @since 2.1.0
*
* @param string $location The path to redirect to.
* @param int $status Status code to use.
*/
$location = apply_filters( 'wp_redirect', $location, $status );
/**
* Filters the redirect status code.
*
* @since 2.3.0
*
* @param int $status Status code to use.
* @param string $location The path to redirect to.
*/
$status = apply_filters( 'wp_redirect_status', $status, $location );
if ( ! $location )
return false;
$location = wp_sanitize_redirect($location, $strip_new_lines);
if ( !$is_IIS && PHP_SAPI != 'cgi-fcgi' )
status_header($status); // This causes problems on IIS and some FastCGI setups
header("Location: $location", true, $status);
return true;
}
endif;
if ( !function_exists('wp_sanitize_redirect') ) :
/**
* Sanitizes a URL for use in a redirect.
*
* @since 2.3.0
*
* @param string $location The path to redirect to.
* @return string Redirect-sanitized URL.
**/
function wp_sanitize_redirect($location, $strip_new_lines = true) {
$regex = '/
(
(?: [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xE1-\xEC][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| [\xEE-\xEF][\x80-\xBF]{2}
| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
){1,40} # ...one or more times
)/x';
$location = preg_replace_callback( $regex, '_wp_sanitize_utf8_in_redirect', $location );
$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%!*\[\]()@]|i', '', $location);
$location = wp_kses_no_null($location);
// remove %0d and %0a from location
$strip = array('%0d', '%0a', '%0D', '%0A');
return $strip_new_lines ? _deep_replace( $strip, $location ) : $location;
}
/**
* URL encode UTF-8 characters in a URL.
*
* @ignore
* @since 4.2.0
* @access private
*
* @see wp_sanitize_redirect()
*
* @param array $matches RegEx matches against the redirect location.
* @return string URL-encoded version of the first RegEx match.
*/
function _wp_sanitize_utf8_in_redirect( $matches ) {
return urlencode( $matches[0] );
}
endif;
それからあなたは呼び出すことができます:
// by default is removing new lines so we pass false
$strip_new_lines = false;
$location = "/upload_success?responseMsg=".urlencode($new_body->message);
// make sure you pass the correct HTTP
// status here to prevent penalty or any other SEO issue
$status = 302;
wp_redirect( $location, $status, $strip_new_lines );
// wp_redirect() does not exit automatically
exit;