使用rawurlencode编解码JSON时URL出现多余特殊字符问题求助
问题描述
尝试将图片URL的JSON数组传递至另一页面,但重定向URL中出现大量斜杠、特殊字符。已尝试urlencode和rawurlencode,问题依旧。
编码代码:
if (!empty($images)) { $encoded_urls = rawurlencode(json_encode($images)); // Generate the redirect URL $redirect_url = add_query_arg([ 'urls' => $encoded_urls, 'type' => 'image', ], site_url('/display-document/')); // Log the redirect URL for debugging error_log("Redirect URL: " . $redirect_url); // Send the JSON response with the redirect URL wp_send_json_success([ 'redirect_url' => $redirect_url ]); } else { error_log("No images found."); wp_send_json_error('No document found for the given details.'); }
解码代码:
$documentUrls = isset($_GET['urls']) ? json_decode(rawurldecode($_GET['urls']), true) : []; $documentType = isset($_GET['type']) ? sanitize_text_field($_GET['type']) : '';
生成的URL示例:
https://checkvisaonlinenow.com/display-document/?urls=%5B%22https%3A%5C%2F%5C%2Fcheckvisaonlinenow.com%5C%2Fwp-content%5C%2Fuploads%5C%2F2024%5C%2F08%5C%2Fconverted_images%5C%2Fimage-66cb2563608de-0.jpeg%22%2C%22https%3A%5C%2F%5C%2Fcheckvisaonlinenow.com%5C%2Fwp-content%5C%2Fuploads%5C%2F2024%5C%2F08%5C%2Fconverted_images%5C%2Fimage-66cb2568a92f2-0.jpeg%22%2C%22https%3A%5C%2F%5C%2Fcheckvisaonlinenow.com%5C%2Fwp-content%5C%2Fuploads%5C%2F2024%5C%2F08%5C%2Fconverted_images%5C%2Fimage-66cb2569293a8-1.jpeg%22%5D&type=image
问题原因与解决方案
原因分析
- JSON默认转义斜杠:
json_encode默认会把字符串中的/转义为\/,后续rawurlencode又会把转义符\编码成%5C,导致URL里出现大量冗余的%5C。 - 双重URL编码:
add_query_arg函数本身会自动对参数值做URL编码,你提前手动调用rawurlencode等于做了两次编码,进一步放大了特殊字符问题。
修正方案
- 禁用JSON对斜杠的转义:给
json_encode添加JSON_UNESCAPED_SLASHES参数。 - 移除手动的
rawurlencode,让add_query_arg负责参数的URL编码。
修正后的编码代码
if (!empty($images)) { // 禁用斜杠转义,避免生成多余的\ $json_urls = json_encode($images, JSON_UNESCAPED_SLASHES); // add_query_arg会自动处理URL编码,无需手动调用rawurlencode $redirect_url = add_query_arg([ 'urls' => $json_urls, 'type' => 'image', ], site_url('/display-document/')); error_log("Redirect URL: " . $redirect_url); wp_send_json_success([ 'redirect_url' => $redirect_url ]); } else { error_log("No images found."); wp_send_json_error('No document found for the given details.'); }
修正后的解码代码
PHP会自动解码$_GET中的URL编码参数,因此无需再调用rawurldecode,直接解析JSON即可:
$documentUrls = isset($_GET['urls']) ? json_decode($_GET['urls'], true) : []; $documentType = isset($_GET['type']) ? sanitize_text_field($_GET['type']) : '';
内容的提问来源于stack exchange,提问作者Bilal Khan
相关产品推荐
相关产品推荐

