Vic*_*kel 3 php .htaccess codeigniter xml-sitemap codeigniter-3
注意:这不是关于站点地图的工作原理,或者站点地图结构的外观,也不是与 SEO 相关的问题。
我的域mysite.com和mysite.pt是同一站点的 2 种语言版本(EN、PT)。内容通过数据库驱动的 CMS 动态添加/删除。
每个菜单/类别更新都会创建其特定于语言的路由,例如:mysite.com/beach和mysite.pt/praia,其中两者都创建指向同一控制器的路由,例如site_manager/page/beaches.
每个语言版本的代码库是相同的,因此所有语言版本只有一个 /application、/assets 和 /system 文件夹。该语言的具体内容是通过加载<?=$this->lang->line('my_token1')?>
文件系统如下所示:
/public_html
/mysite.com/index.php
/mysite.pt/index.php
/all_sites/application
/all_sites/assets
/all_sites/system
Run Code Online (Sandbox Code Playgroud)
两个站点的路由目录中的 index.php 文件更改系统和应用程序文件夹位置:
$system_path = '/home/my_host/public_html/all_sites/system';
$application_folder = '/home/my_host/public_html/all_sites/application';
Run Code Online (Sandbox Code Playgroud)
此设置工作顺利。但是 CMS 很旧,并且不会在菜单或内容更改时创建更新的站点地图。
所以我想了另一种提供更新的站点/特定语言的方法sitemap.xml:当机器人来扫描站点时,可以即时创建站点地图并为机器人提供最新的sitemap.xml
我通过创建一个控制器方法解决了这个问题,该方法site_manager/sitemap()解析数据库条目并输出一个站点地图echo $this->load->view('sitemap',$data,true);
哪些输出,取决于站点:
<!-- created by mysite.pt, 2020-12-22 -->
<url>
<loc>https:// mysite.pt/</loc>
<lastmod>2020-12-22T20:53:36+00:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https:// mysite.pt/praias.html</loc>
<lastmod>2020-12-22T19:51:51+00:00</lastmod>
<priority>0.80</priority>
</url>
Run Code Online (Sandbox Code Playgroud)
或者
<!-- created by mysite.com, 2020-12-22 -->
<url>
<loc>https:// mysite.com/</loc>
<lastmod>2020-12-22T20:53:36+00:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https:// mysite.com/beaches.html</loc>
<lastmod>2020-12-22T19:51:51+00:00</lastmod>
<priority>0.80</priority>
</url>
Run Code Online (Sandbox Code Playgroud)
问题: 这个设置的问题是我在根目录中不会有任何 sitemap.xml,因为一旦使用了控制器功能,就只有一个回显输出。机器人会空手而归,因为没有找到任何 sitemap.xml,如果你输入 mysite.com/sitemap.xml 也是一样。
如何让机器人访问控制器方法并因此读取生成的输出?
机器人正在sitemap.xml网站的根目录中寻找。
为了让机器人“读取”控制器的回显输出,它需要被定向到控制器功能,在我们的例子中是site_manager/sitemap()。
诀窍是将 .htaccess 重定向到创建站点地图输出的控制器,注意site_manager在 routes.php 中设置为默认控制器:
将 sitemap.xml 重定向到 sitemap.php
RewriteRule ^sitemap\.xml$ sitemap.php [L]
Run Code Online (Sandbox Code Playgroud)
这意味着试图读取“不存在的echo $this->load->view('sitemap',$data,true);
站点地图.xml ”的机器人被重定向到控制器,并通过动态站点地图数据的输出即时馈送,尽可能获取最新的站点地图 xml 数据。
您可以测试是否成功创建站点地图,例如https://mysite.pt/sitemap.xml 在浏览器中键入 :
注意:你不会在你的 ftp 目录列表中找到上面创建的 sitemap.xml 文件ftp://mysite.pt!,因为这个文件从未被写入或上传过。
您还可以通过谷歌、必应等市长目录列表的搜索控制台进行验证,并确认绕过机器人是否成功提交了站点地图