Java生成sitemap网站地图

sitemap 是什么?对应没有接触过网站 SEO 的同学可能不知道,这里引用一下百度站长的一段解释。

Sitemap(即站点地图)就是您网站上各网页的列表。创建并提交Sitemap有助于百度发现并了解您网站上的所有网页。您还可以使用Sitemap提供有关您网站的其他信息,如上次更新日期、Sitemap文件的更新频率等,供百度Spider参考

简单来说,sitemap 就是搜索引擎爬虫便于爬取到网站内的所有网页。

<!--more-->

SEO之初

之前特意通过 site 指令查询过公司同行业网站的收录情况,发现搜索引擎对于我司的网站收录数量真的不是差了一星半点-.-,原因嘛,就是一直没有专门的人做 SEO 优化工作。

前几个月我倒是生成了网站的一部分 sitemap 提交到神马搜索站长平台,但是明明是按照官方文档格式生成的,却一直提示格式不对,也不知道什么情况,也没有官方反馈渠道,就不了了之了。最近公司新招了 SEO 专员,于是便有了定时生成 sitemap 文件的需求。这种生成的文件一般都是对外直接可以访问的,可以通过 nginx 配置静态资源文件来完成。

需求探讨

sitemap 的格式一般是 XML 格式的,第一反应就是可以使用 DOM4J 来完成,但是做 SEO 的同事说了,因为 sitemap 文件的限制,同一个 sitemap 文件最多有 5 万条 URL,超出 5 万条,就应该放入到下一个 sitemap 文件当中去。通过 DOM4J 来做的话,还需要判断条数感觉有点麻烦(懒),就上 gayhub 搜了一下相关的轮子 generate sitemap,找到了现成的轮子 sitemapgen4j,项目的 README 中使用方法写的比较完善,这里不再多说。

为什么文档很完善的情况下,我要写这篇博客呢?(10月第一篇,凑数的(逃~)

上文提到了,如果超出了 5 万条需要写入另外一个 sitemap 当中,这个功能 sitemapgen4j 已经替我们实现了,无需担心。如果超出,生成的文件就像是这样的:

1- article1.xml 2- article2.xml 3- article3.xml 4- article4.xml

这样的话,在站长平台这里,如果新增了文件就要新增一条sitemap 网址记录,很麻烦。

好在,搜索引擎考虑到了这种问题,有相应的解决方法。

我们把每次生成的 sitemap 文件的地址,添加到一个 sitemap 索引文件当中去,这样,我们只需要向平台提交一个 sitemap 索引文件的地址即可。

不多说,代码见。

生成 sitemap 文件

首先引入 sitemapgen4j 依赖

1<dependency> 2 <groupId>com.github.dfabulich</groupId> 3 <artifactId>sitemapgen4j</artifactId> 4 <version>1.1.1</version> 5</dependency>

编写生成 sitemap 代码

1public void generateSitemap() { 2 String tempPath = "/home/seo"; 3 //String tempPath = System.getProperty("java.io.tmpdir") + File.separator + "/seo/"; 4 File file = new File(tempPath); 5 if (!file.exists()) { 6 file.mkdirs(); 7 } 8 String domain = "https://www.domain.com"; 9 try { 10 WebSitemapGenerator g1 = WebSitemapGenerator.builder(domain, file) 11 .fileNamePrefix("article").build(); 12 Date date = new Date(); 13 for (int i = 1; i < 21; i++) { 14 WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/article/" + i ).lastMod(date).build(); 15 g1.addUrl(url); 16 } 17 18 WebSitemapGenerator g2 = WebSitemapGenerator.builder(domain, file) 19 .fileNamePrefix("issue").build(); 20 Date date2 = new Date(); 21 for (int i = 1; i < 21; i++) { 22 WebSitemapUrl url = new WebSitemapUrl.Options(domain + "/issue/" + i ).lastMod(date2).build(); 23 g2.addUrl(url); 24 } 25 26 List<String> fileNames = new ArrayList<>(); 27 28 // 生成 sitemap 文件 29 List<File> articleFiles = g1.write(); 30 articleFiles.forEach(e -> fileNames.add(e.getName())); 31 List<File> issueFiles = g2.write(); 32 issueFiles.forEach(e -> fileNames.add(e.getName())); 33 34 // 构造 sitemap_index 生成器 35 W3CDateFormat dateFormat = new W3CDateFormat(W3CDateFormat.Pattern.DAY); 36 SitemapIndexGenerator sitemapIndexGenerator = new SitemapIndexGenerator 37 .Options(domain, new File(tempPath + "sitemap_index.xml")) 38 .dateFormat(dateFormat) 39 .autoValidate(true) 40 .build(); 41 42 fileNames.forEach(e -> { 43 try { 44 // 组装 sitemap 文件 URL 地址 45 sitemapIndexGenerator.addUrl(tempPath + e); 46 } catch (MalformedURLException e1) { 47 e1.printStackTrace(); 48 } 49 }); 50 51 // 生成 sitemap_index 文件 52 sitemapIndexGenerator.write(); 53 54 } catch (MalformedURLException e) { 55 e.printStackTrace(); 56 } 57}

通过 Nginx 提供给外部访问

文件已经生成了,就需要对外提供访问了,这里使用 nginx 来实现,如果用 apache 也是可以的。

上文生成的文件我放在了 /home/seo 目录下,文件有

1- seo 2 - article1.xml 3 - article2.xml 4 - article3.xml 5 - article4.xml 6 - sitemap_index.xml

现在修改 nginx 配置文件,这里说明一下,因为 sitemap 生成一份就可以了,但是要通过域名能直接访问到,所以需要在 nginx 跳转一下到有 sitemap 文件的服务器。

存放 sitemap 文件的 nginx 配置如下

1server { 2 listen 8888; 3 server_name 111.112.113.114; 4 charset utf8; 5 6 access_log logs/access.log main; 7 8 location / { 9 alias /home/seo/; 10 sendfile on; 11 autoindex on; 12 autoindex_exact_size off; 13 autoindex_localtime on; 14 } 15}

根域名的 nginx 配置文件

1server { 2 listen 80; 3 server_name www.domain.com; 4 charset utf8; 5 6 access_log logs/access.log main; 7 8 location /seo/ { 9 proxy_pass http://111.112.113.114:8888; 10 } 11 12 location / { 13 proxy_pass http://homeServer; 14 } 15}

注意: 第一个 location块 中的 proxy_pass 行尾有个 /

www.domain.com/seo/sitemap\_index.xml 就会在 www.domain.com 这里直接反代到 111.112.113.114 这台服务器上了。

站长平台只用提交这一个 URL www.domain.com/seo/sitemap\_index.xml 即可。

有疑问?

欢迎来信,给我写信

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap