背景

建站以来,试过好多方法实现 sitemap.xml ,从最早的手动更新,到后来每次更新自动写入本地io文件。一方面感觉太零零散散,另外实时的程度不高,再加上好多ZZ引擎,sitemap的要求还能和别人不一样。。。总之最终决定写个动态的,通过springboot的GET接口返回字符串实现,xml结构不复杂,就自己拼。最终通过nginx代理到网站的sitemap.xml上去。让ZZ引擎以为是静态的。



代码


实体类

SiteMap.java

  1. import com.zzzmh.api.utils.DateUtils;
  2. import com.zzzmh.api.utils.SiteMapUtils;
  3. import java.util.Date;
  4. public class SiteMap {
  5. public SiteMap() {
  6. }
  7. public SiteMap(String loc) {
  8. this.loc = loc;
  9. this.lastmod = new Date();
  10. this.changefreq = SiteMapUtils.CHANGEFREQ_ALWAYS;
  11. this.priority = "1.0";
  12. }
  13. public SiteMap(String loc, Date lastmod, String changefreq, String priority) {
  14. this.loc = loc;
  15. this.lastmod = lastmod;
  16. this.changefreq = changefreq;
  17. this.priority = priority;
  18. }
  19. /**
  20. * url https://www.xxx.com
  21. */
  22. private String loc;
  23. /**
  24. * 最后更新时间 yyyy-MM-dd
  25. */
  26. private Date lastmod;
  27. /**
  28. * 更新速度 always hourly daily weekly monthly yearly never
  29. */
  30. private String changefreq;
  31. /**
  32. * 权重 1.0 0.9 0.8
  33. */
  34. private String priority;
  35. public String getLoc() {
  36. return loc;
  37. }
  38. public void setLoc(String loc) {
  39. this.loc = loc;
  40. }
  41. public Date getLastmod() {
  42. return lastmod;
  43. }
  44. public void setLastmod(Date lastmod) {
  45. this.lastmod = lastmod;
  46. }
  47. public String getChangefreq() {
  48. return changefreq;
  49. }
  50. public void setChangefreq(String changefreq) {
  51. this.changefreq = changefreq;
  52. }
  53. public String getPriority() {
  54. return priority;
  55. }
  56. public void setPriority(String priority) {
  57. this.priority = priority;
  58. }
  59. @Override
  60. /** 重写 toString 适应xml格式 */
  61. public String toString() {
  62. StringBuffer sb = new StringBuffer();
  63. sb.append("<url>");
  64. sb.append("<loc>" + loc + "</loc>");
  65. sb.append("<lastmod>" + DateUtils.sdf_yyyy_MM_dd.format(lastmod) + "</lastmod>");
  66. sb.append("<changefreq>" + changefreq + "</changefreq>");
  67. sb.append("<priority>" + priority + "</priority>");
  68. sb.append("</url>");
  69. return sb.toString();
  70. }
  71. }

工具类

SiteMapUtils.java

  1. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  2. import com.zzzmh.api.entity.BlogCard;
  3. import com.zzzmh.api.entity.ChromeCrx;
  4. import com.zzzmh.api.entity.SiteMap;
  5. import com.zzzmh.api.service.IBlogCardService;
  6. import com.zzzmh.api.service.IChromeCrxService;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Component;
  9. import java.util.Date;
  10. import java.util.List;
  11. /**
  12. * @author zzzmh
  13. * @since 2019-8-13
  14. * <p>
  15. * 动态生成 sitemap工具类
  16. * 直连数据库,取出数据拼xml
  17. */
  18. @Component
  19. public class SiteMapUtils {
  20. public final static String BEGIN_DOC = "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">";
  21. public final static String END_DOC = "</urlset>";
  22. public final static String CHANGEFREQ_ALWAYS = "always";
  23. public final static String CHANGEFREQ_HOURLY = "hourly";
  24. public final static String CHANGEFREQ_DAILY = "daily";
  25. public final static String CHANGEFREQ_WEEKLY = "weekly";
  26. public final static String CHANGEFREQ_MONTHLY = "monthly";
  27. public final static String CHANGEFREQ_YEARLY = "yearly";
  28. public final static String CHANGEFREQ_NEVER = "never";
  29. @Autowired
  30. private IBlogCardService blogCardService;
  31. @Autowired
  32. private IChromeCrxService chromeCrxService;
  33. public String getBlogSiteMap() {
  34. StringBuffer sb = new StringBuffer();
  35. sb.append(BEGIN_DOC);
  36. sb.append(new SiteMap("https://zzzmh.cn"));
  37. QueryWrapper<BlogCard> wrapper = new QueryWrapper<>();
  38. List<BlogCard> cards = blogCardService.list(wrapper.eq("isdel", 0).orderByDesc("id"));
  39. for (BlogCard card : cards) {
  40. sb.append(new SiteMap("https://zzzmh.cn/single?id=" + card.getId(), card.getDate(), CHANGEFREQ_MONTHLY, "0.9"));
  41. }
  42. sb.append(END_DOC);
  43. return sb.toString();
  44. }
  45. public String getBzSiteMap() {
  46. StringBuffer sb = new StringBuffer();
  47. sb.append(BEGIN_DOC);
  48. sb.append(new SiteMap("https://bz.zzzmh.cn"));
  49. sb.append(END_DOC);
  50. return sb.toString();
  51. }
  52. }

接口调用

Controller.java

  1. @GetMapping(value = "/{path}/sitemap.xml",produces = {"application/xml"})
  2. @ApiOperation("获取 sitemap.xml")
  3. public String getSiteMap(@PathVariable("path") String path) {
  4. switch (path) {
  5. case "blog": {
  6. return siteMapUtils.getBlogSiteMap();
  7. }
  8. case "bz": {
  9. return siteMapUtils.getBzSiteMap();
  10. }
  11. default: {
  12. return "";
  13. }
  14. }
  15. }


效果

访问url http://localhost:10000/api/blog/sitemap.xml
得到以下内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <urlset
  3. xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  4. <url>
  5. <loc>https://zzzmh.cn</loc>
  6. <lastmod>2019-08-13</lastmod>
  7. <changefreq>always</changefreq>
  8. <priority>1.0</priority>
  9. </url>
  10. <url>
  11. <loc>https://zzzmh.cn/single?id=77</loc>
  12. <lastmod>2019-07-12</lastmod>
  13. <changefreq>monthly</changefreq>
  14. <priority>0.9</priority>
  15. </url>
  16. <url>
  17. <loc>https://zzzmh.cn/single?id=76</loc>
  18. <lastmod>2019-07-12</lastmod>
  19. <changefreq>monthly</changefreq>
  20. <priority>0.9</priority>
  21. </url>
  22. <url>
  23. <loc>https://zzzmh.cn/single?id=75</loc>
  24. <lastmod>2019-07-11</lastmod>
  25. <changefreq>monthly</changefreq>
  26. <priority>0.9</priority>
  27. </url>
  28. <url>
  29. <loc>https://zzzmh.cn/single?id=74</loc>
  30. <lastmod>2019-07-10</lastmod>
  31. <changefreq>monthly</changefreq>
  32. <priority>0.9</priority>
  33. </url>
  34. <url>
  35. <loc>https://zzzmh.cn/single?id=73</loc>
  36. <lastmod>2019-07-07</lastmod>
  37. <changefreq>monthly</changefreq>
  38. <priority>0.9</priority>
  39. </url>
  40. <url>
  41. <loc>https://zzzmh.cn/single?id=72</loc>
  42. <lastmod>2019-07-07</lastmod>
  43. <changefreq>monthly</changefreq>
  44. <priority>0.9</priority>
  45. </url>
  46. <url>
  47. <loc>https://zzzmh.cn/single?id=71</loc>
  48. <lastmod>2019-07-06</lastmod>
  49. <changefreq>monthly</changefreq>
  50. <priority>0.9</priority>
  51. </url>
  52. <url>
  53. <loc>https://zzzmh.cn/single?id=70</loc>
  54. <lastmod>2019-07-06</lastmod>
  55. <changefreq>monthly</changefreq>
  56. <priority>0.9</priority>
  57. </url>
  58. <url>
  59. <loc>https://zzzmh.cn/single?id=69</loc>
  60. <lastmod>2019-06-30</lastmod>
  61. <changefreq>monthly</changefreq>
  62. <priority>0.9</priority>
  63. </url>
  64. <url>
  65. <loc>https://zzzmh.cn/single?id=68</loc>
  66. <lastmod>2019-06-28</lastmod>
  67. <changefreq>monthly</changefreq>
  68. <priority>0.9</priority>
  69. </url>
  70. <url>
  71. <loc>https://zzzmh.cn/single?id=67</loc>
  72. <lastmod>2019-05-16</lastmod>
  73. <changefreq>monthly</changefreq>
  74. <priority>0.9</priority>
  75. </url>
  76. <url>
  77. <loc>https://zzzmh.cn/single?id=66</loc>
  78. <lastmod>2019-05-09</lastmod>
  79. <changefreq>monthly</changefreq>
  80. <priority>0.9</priority>
  81. </url>
  82. <url>
  83. <loc>https://zzzmh.cn/single?id=65</loc>
  84. <lastmod>2019-04-26</lastmod>
  85. <changefreq>monthly</changefreq>
  86. <priority>0.9</priority>
  87. </url>
  88. <url>
  89. <loc>https://zzzmh.cn/single?id=64</loc>
  90. <lastmod>2019-04-11</lastmod>
  91. <changefreq>monthly</changefreq>
  92. <priority>0.9</priority>
  93. </url>
  94. <url>
  95. <loc>https://zzzmh.cn/single?id=63</loc>
  96. <lastmod>2019-04-10</lastmod>
  97. <changefreq>monthly</changefreq>
  98. <priority>0.9</priority>
  99. </url>
  100. <url>
  101. <loc>https://zzzmh.cn/single?id=62</loc>
  102. <lastmod>2019-03-18</lastmod>
  103. <changefreq>monthly</changefreq>
  104. <priority>0.9</priority>
  105. </url>
  106. <url>
  107. <loc>https://zzzmh.cn/single?id=61</loc>
  108. <lastmod>2019-02-14</lastmod>
  109. <changefreq>monthly</changefreq>
  110. <priority>0.9</priority>
  111. </url>
  112. <url>
  113. <loc>https://zzzmh.cn/single?id=60</loc>
  114. <lastmod>2019-01-25</lastmod>
  115. <changefreq>monthly</changefreq>
  116. <priority>0.9</priority>
  117. </url>
  118. <url>
  119. <loc>https://zzzmh.cn/single?id=59</loc>
  120. <lastmod>2019-01-23</lastmod>
  121. <changefreq>monthly</changefreq>
  122. <priority>0.9</priority>
  123. </url>
  124. <url>
  125. <loc>https://zzzmh.cn/single?id=58</loc>
  126. <lastmod>2019-01-22</lastmod>
  127. <changefreq>monthly</changefreq>
  128. <priority>0.9</priority>
  129. </url>
  130. <url>
  131. <loc>https://zzzmh.cn/single?id=57</loc>
  132. <lastmod>2019-01-19</lastmod>
  133. <changefreq>monthly</changefreq>
  134. <priority>0.9</priority>
  135. </url>
  136. <url>
  137. <loc>https://zzzmh.cn/single?id=56</loc>
  138. <lastmod>2019-01-09</lastmod>
  139. <changefreq>monthly</changefreq>
  140. <priority>0.9</priority>
  141. </url>
  142. <url>
  143. <loc>https://zzzmh.cn/single?id=55</loc>
  144. <lastmod>2019-01-09</lastmod>
  145. <changefreq>monthly</changefreq>
  146. <priority>0.9</priority>
  147. </url>
  148. <url>
  149. <loc>https://zzzmh.cn/single?id=54</loc>
  150. <lastmod>2019-01-04</lastmod>
  151. <changefreq>monthly</changefreq>
  152. <priority>0.9</priority>
  153. </url>
  154. <url>
  155. <loc>https://zzzmh.cn/single?id=53</loc>
  156. <lastmod>2019-01-04</lastmod>
  157. <changefreq>monthly</changefreq>
  158. <priority>0.9</priority>
  159. </url>
  160. <url>
  161. <loc>https://zzzmh.cn/single?id=51</loc>
  162. <lastmod>2018-12-17</lastmod>
  163. <changefreq>monthly</changefreq>
  164. <priority>0.9</priority>
  165. </url>
  166. <url>
  167. <loc>https://zzzmh.cn/single?id=50</loc>
  168. <lastmod>2018-12-09</lastmod>
  169. <changefreq>monthly</changefreq>
  170. <priority>0.9</priority>
  171. </url>
  172. <url>
  173. <loc>https://zzzmh.cn/single?id=49</loc>
  174. <lastmod>2018-11-30</lastmod>
  175. <changefreq>monthly</changefreq>
  176. <priority>0.9</priority>
  177. </url>
  178. <url>
  179. <loc>https://zzzmh.cn/single?id=48</loc>
  180. <lastmod>2018-11-25</lastmod>
  181. <changefreq>monthly</changefreq>
  182. <priority>0.9</priority>
  183. </url>
  184. <url>
  185. <loc>https://zzzmh.cn/single?id=47</loc>
  186. <lastmod>2018-11-22</lastmod>
  187. <changefreq>monthly</changefreq>
  188. <priority>0.9</priority>
  189. </url>
  190. <url>
  191. <loc>https://zzzmh.cn/single?id=46</loc>
  192. <lastmod>2018-11-18</lastmod>
  193. <changefreq>monthly</changefreq>
  194. <priority>0.9</priority>
  195. </url>
  196. <url>
  197. <loc>https://zzzmh.cn/single?id=45</loc>
  198. <lastmod>2018-11-13</lastmod>
  199. <changefreq>monthly</changefreq>
  200. <priority>0.9</priority>
  201. </url>
  202. <url>
  203. <loc>https://zzzmh.cn/single?id=44</loc>
  204. <lastmod>2018-11-10</lastmod>
  205. <changefreq>monthly</changefreq>
  206. <priority>0.9</priority>
  207. </url>
  208. <url>
  209. <loc>https://zzzmh.cn/single?id=43</loc>
  210. <lastmod>2018-10-24</lastmod>
  211. <changefreq>monthly</changefreq>
  212. <priority>0.9</priority>
  213. </url>
  214. <url>
  215. <loc>https://zzzmh.cn/single?id=42</loc>
  216. <lastmod>2018-10-21</lastmod>
  217. <changefreq>monthly</changefreq>
  218. <priority>0.9</priority>
  219. </url>
  220. <url>
  221. <loc>https://zzzmh.cn/single?id=41</loc>
  222. <lastmod>2018-10-08</lastmod>
  223. <changefreq>monthly</changefreq>
  224. <priority>0.9</priority>
  225. </url>
  226. <url>
  227. <loc>https://zzzmh.cn/single?id=40</loc>
  228. <lastmod>2018-10-04</lastmod>
  229. <changefreq>monthly</changefreq>
  230. <priority>0.9</priority>
  231. </url>
  232. <url>
  233. <loc>https://zzzmh.cn/single?id=39</loc>
  234. <lastmod>2018-10-01</lastmod>
  235. <changefreq>monthly</changefreq>
  236. <priority>0.9</priority>
  237. </url>
  238. <url>
  239. <loc>https://zzzmh.cn/single?id=38</loc>
  240. <lastmod>2018-09-19</lastmod>
  241. <changefreq>monthly</changefreq>
  242. <priority>0.9</priority>
  243. </url>
  244. <url>
  245. <loc>https://zzzmh.cn/single?id=37</loc>
  246. <lastmod>2018-09-19</lastmod>
  247. <changefreq>monthly</changefreq>
  248. <priority>0.9</priority>
  249. </url>
  250. <url>
  251. <loc>https://zzzmh.cn/single?id=36</loc>
  252. <lastmod>2018-09-08</lastmod>
  253. <changefreq>monthly</changefreq>
  254. <priority>0.9</priority>
  255. </url>
  256. <url>
  257. <loc>https://zzzmh.cn/single?id=35</loc>
  258. <lastmod>2018-09-01</lastmod>
  259. <changefreq>monthly</changefreq>
  260. <priority>0.9</priority>
  261. </url>
  262. <url>
  263. <loc>https://zzzmh.cn/single?id=34</loc>
  264. <lastmod>2018-08-28</lastmod>
  265. <changefreq>monthly</changefreq>
  266. <priority>0.9</priority>
  267. </url>
  268. <url>
  269. <loc>https://zzzmh.cn/single?id=33</loc>
  270. <lastmod>2018-08-26</lastmod>
  271. <changefreq>monthly</changefreq>
  272. <priority>0.9</priority>
  273. </url>
  274. <url>
  275. <loc>https://zzzmh.cn/single?id=32</loc>
  276. <lastmod>2018-08-26</lastmod>
  277. <changefreq>monthly</changefreq>
  278. <priority>0.9</priority>
  279. </url>
  280. <url>
  281. <loc>https://zzzmh.cn/single?id=31</loc>
  282. <lastmod>2018-08-25</lastmod>
  283. <changefreq>monthly</changefreq>
  284. <priority>0.9</priority>
  285. </url>
  286. <url>
  287. <loc>https://zzzmh.cn/single?id=30</loc>
  288. <lastmod>2018-08-25</lastmod>
  289. <changefreq>monthly</changefreq>
  290. <priority>0.9</priority>
  291. </url>
  292. <url>
  293. <loc>https://zzzmh.cn/single?id=29</loc>
  294. <lastmod>2018-08-20</lastmod>
  295. <changefreq>monthly</changefreq>
  296. <priority>0.9</priority>
  297. </url>
  298. <url>
  299. <loc>https://zzzmh.cn/single?id=28</loc>
  300. <lastmod>2018-08-18</lastmod>
  301. <changefreq>monthly</changefreq>
  302. <priority>0.9</priority>
  303. </url>
  304. <url>
  305. <loc>https://zzzmh.cn/single?id=27</loc>
  306. <lastmod>2018-08-18</lastmod>
  307. <changefreq>monthly</changefreq>
  308. <priority>0.9</priority>
  309. </url>
  310. <url>
  311. <loc>https://zzzmh.cn/single?id=26</loc>
  312. <lastmod>2018-08-18</lastmod>
  313. <changefreq>monthly</changefreq>
  314. <priority>0.9</priority>
  315. </url>
  316. <url>
  317. <loc>https://zzzmh.cn/single?id=25</loc>
  318. <lastmod>2018-08-15</lastmod>
  319. <changefreq>monthly</changefreq>
  320. <priority>0.9</priority>
  321. </url>
  322. <url>
  323. <loc>https://zzzmh.cn/single?id=24</loc>
  324. <lastmod>2018-08-14</lastmod>
  325. <changefreq>monthly</changefreq>
  326. <priority>0.9</priority>
  327. </url>
  328. <url>
  329. <loc>https://zzzmh.cn/single?id=22</loc>
  330. <lastmod>2018-08-05</lastmod>
  331. <changefreq>monthly</changefreq>
  332. <priority>0.9</priority>
  333. </url>
  334. <url>
  335. <loc>https://zzzmh.cn/single?id=21</loc>
  336. <lastmod>2018-08-03</lastmod>
  337. <changefreq>monthly</changefreq>
  338. <priority>0.9</priority>
  339. </url>
  340. <url>
  341. <loc>https://zzzmh.cn/single?id=20</loc>
  342. <lastmod>2018-08-03</lastmod>
  343. <changefreq>monthly</changefreq>
  344. <priority>0.9</priority>
  345. </url>
  346. <url>
  347. <loc>https://zzzmh.cn/single?id=19</loc>
  348. <lastmod>2018-08-03</lastmod>
  349. <changefreq>monthly</changefreq>
  350. <priority>0.9</priority>
  351. </url>
  352. <url>
  353. <loc>https://zzzmh.cn/single?id=18</loc>
  354. <lastmod>2018-08-03</lastmod>
  355. <changefreq>monthly</changefreq>
  356. <priority>0.9</priority>
  357. </url>
  358. <url>
  359. <loc>https://zzzmh.cn/single?id=17</loc>
  360. <lastmod>2018-08-03</lastmod>
  361. <changefreq>monthly</changefreq>
  362. <priority>0.9</priority>
  363. </url>
  364. <url>
  365. <loc>https://zzzmh.cn/single?id=16</loc>
  366. <lastmod>2018-08-03</lastmod>
  367. <changefreq>monthly</changefreq>
  368. <priority>0.9</priority>
  369. </url>
  370. <url>
  371. <loc>https://zzzmh.cn/single?id=15</loc>
  372. <lastmod>2018-07-15</lastmod>
  373. <changefreq>monthly</changefreq>
  374. <priority>0.9</priority>
  375. </url>
  376. <url>
  377. <loc>https://zzzmh.cn/single?id=14</loc>
  378. <lastmod>2018-07-14</lastmod>
  379. <changefreq>monthly</changefreq>
  380. <priority>0.9</priority>
  381. </url>
  382. <url>
  383. <loc>https://zzzmh.cn/single?id=13</loc>
  384. <lastmod>2018-07-05</lastmod>
  385. <changefreq>monthly</changefreq>
  386. <priority>0.9</priority>
  387. </url>
  388. <url>
  389. <loc>https://zzzmh.cn/single?id=12</loc>
  390. <lastmod>2018-06-26</lastmod>
  391. <changefreq>monthly</changefreq>
  392. <priority>0.9</priority>
  393. </url>
  394. <url>
  395. <loc>https://zzzmh.cn/single?id=11</loc>
  396. <lastmod>2018-06-20</lastmod>
  397. <changefreq>monthly</changefreq>
  398. <priority>0.9</priority>
  399. </url>
  400. <url>
  401. <loc>https://zzzmh.cn/single?id=7</loc>
  402. <lastmod>2018-05-15</lastmod>
  403. <changefreq>monthly</changefreq>
  404. <priority>0.9</priority>
  405. </url>
  406. <url>
  407. <loc>https://zzzmh.cn/single?id=6</loc>
  408. <lastmod>2018-05-04</lastmod>
  409. <changefreq>monthly</changefreq>
  410. <priority>0.9</priority>
  411. </url>
  412. <url>
  413. <loc>https://zzzmh.cn/single?id=5</loc>
  414. <lastmod>2018-04-26</lastmod>
  415. <changefreq>monthly</changefreq>
  416. <priority>0.9</priority>
  417. </url>
  418. <url>
  419. <loc>https://zzzmh.cn/single?id=3</loc>
  420. <lastmod>2018-03-26</lastmod>
  421. <changefreq>monthly</changefreq>
  422. <priority>0.9</priority>
  423. </url>
  424. <url>
  425. <loc>https://zzzmh.cn/single?id=2</loc>
  426. <lastmod>2018-03-21</lastmod>
  427. <changefreq>monthly</changefreq>
  428. <priority>0.9</priority>
  429. </url>
  430. <url>
  431. <loc>https://zzzmh.cn/single?id=1</loc>
  432. <lastmod>2018-04-26</lastmod>
  433. <changefreq>monthly</changefreq>
  434. <priority>0.9</priority>
  435. </url>
  436. <url>
  437. <loc>https://zzzmh.cn/single?id=0</loc>
  438. <lastmod>2018-05-01</lastmod>
  439. <changefreq>monthly</changefreq>
  440. <priority>0.9</priority>
  441. </url>
  442. </urlset>

Nginx反向代理

  1. location /xml/sitemap.xml {
  2. proxy_pass http://localhost:8080/xxx/sitemap.xml;
  3. proxy_set_header Host $host;
  4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  5. proxy_set_header X-Forwarded-Proto https;
  6. proxy_connect_timeout 30;
  7. proxy_read_timeout 30;
  8. proxy_send_timeout 30;
  9. access_log off;
  10. break;
  11. }


END

这样就不再需要手动更新或者定时任务更新sitemap.xml了
并且项目直接可以细分、可以开发不同版本针对不同引擎