如何在CodeIgniter中创建动态站点地图?XML输出异常求助
解决CodeIgniter生成XML站点地图异常的问题
让我们一步步排查并修复你遇到的问题:
1. 修复控制器中的数据赋值逻辑混乱
你的控制器里这段代码存在逻辑混淆:
$query= $this->db->query("SELECT url_slug FROM snippets UNION SELECT tag_name FROM tags"); $data = $query->result(); $data['items'] =$data;
这里$data = $query->result()已经把查询结果(对象数组)赋值给了$data,随后又把这个数组赋值给$data['items'],会导致$data变成一个嵌套数组,虽然视图可能还能拿到$items,但写法不规范,容易引发后续问题。应该改成:
$query = $this->db->query("SELECT url_slug AS slug, 'snippet' AS type FROM snippets UNION SELECT tag_name AS slug, 'tag' AS type FROM tags"); // 先将查询结果单独存储,再放入$data数组传递给视图 $items = $query->result(); $data['items'] = $items;
2. 修正UNION查询的字段一致性与URL路径错误
你的UNION查询中,第一个表取url_slug,第二个表取tag_name,查询结果的字段名会沿用第一个查询的url_slug,但标签记录的实际内容是标签名,而且标签对应的URL应该是tag/标签名而非item/标签名吧?
我们需要给字段统一别名,同时区分两种记录类型,这样视图里就能生成正确的URL:
修改查询语句为:
$query = $this->db->query(" SELECT url_slug AS slug, 'snippet' AS type FROM snippets UNION SELECT tag_name AS slug, 'tag' AS type FROM tags ");
然后在视图里根据类型生成对应URL:
<?php foreach($items as $item) { ?> <url> <loc><?php echo base_url() . ($item->type === 'snippet' ? 'item/' : 'tag/') . $item->slug ?></loc> <priority>0.5</priority> <changefreq>daily</changefreq> </url> <?php } ?>
3. 设置正确的HTTP响应头(关键修复)
这是导致XML显示异常的核心原因!你没有告诉浏览器输出的是XML内容,浏览器会默认按HTML解析,导致格式混乱。在控制器的index方法开头添加:
// 设置XML内容类型响应头 $this->output->set_content_type('application/xml');
4. 优化视图的XML声明格式
视图里的XML声明可以调整得更规范,避免不必要的空格:
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
完整修复后的代码
控制器Sitemap.php
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Sitemap extends CI_Controller { public function __construct() { parent::__construct(); $this->load->database(); $this->load->model('Constant_model'); $this->load->helper('xml'); } public function index() { // 设置XML响应头 $this->output->set_content_type('application/xml'); $query = $this->db->query(" SELECT url_slug AS slug, 'snippet' AS type FROM snippets UNION SELECT tag_name AS slug, 'tag' AS type FROM tags "); $items = $query->result(); $data['items'] = $items; $this->load->view('sitemap', $data); } }
视图sitemap.php
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc><?php echo base_url();?></loc> <priority>1.0</priority> <changefreq>daily</changefreq> </url> <?php foreach($items as $item) { ?> <url> <loc><?php echo base_url() . ($item->type === 'snippet' ? 'item/' : 'tag/') . $item->slug ?></loc> <priority>0.5</priority> <changefreq>daily</changefreq> </url> <?php } ?> </urlset>
现在访问你的sitemap控制器(比如http://your-domain.com/sitemap),应该就能看到格式正确的XML站点地图了。
内容的提问来源于stack exchange,提问作者Hitesh Chauhan
相关产品推荐
相关产品推荐

