OpenCart中HTTP头西里尔字母URL乱码问题求解
问题原因与解决办法
问题根源
HTTP协议要求所有头字段的内容必须使用ASCII字符集,非ASCII字符必须通过百分号编码(符合RFC 3986标准)。你通过$this->url->link()生成的友好URL包含西里尔字符,这些字符是以UTF-8编码存储的,但直接写入Link头时,服务器没有自动对非ASCII字符进行编码,浏览器解析头信息时会默认用ISO-8859-1解码这些UTF-8字节,最终导致乱码。而print_r()输出时,PHP是直接将UTF-8内容输出到页面(页面本身是UTF-8编码),所以显示正常。
解决步骤
在将链接写入HTTP头之前,需要对URL中的非ASCII路径部分进行百分号编码,具体代码修改如下:
// 生成原始友好链接 $link = $this->url->link('product/product', 'product_id=' . $this->request->get['product_id']); // 拆分URL结构,仅编码路径部分 $parsed_url = parse_url($link); $encoded_path = rawurlencode($parsed_url['path']); $canonical_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $encoded_path; // 添加编码后的链接到HTTP头 $this->response->addHeader('Link: <' . $canonical_url . '>; rel="canonical"');
补充说明
- 使用
rawurlencode()而非urlencode(),因为前者完全符合URL编码标准(将空格转为%20而非+),更适合处理URL路径部分。 - 编码后浏览器收到的头信息会是类似
https://www.example.com/%D0%BC%D0%B0%D1%82%D1%80%D0%B0%D0%BA-%D1%81%D0%B8%D0%BC%D0%BE-%D0%BF%D1%80%D1%83%D0%B6%D0%B8%D0%BD%D0%B0的形式,浏览器会自动解码为正常的西里尔字符URL,同时搜索引擎也能正确识别这个规范链接。
内容的提问来源于stack exchange,提问作者bobi
相关产品推荐
相关产品推荐

