diff --git a/404.html b/404.html
index bf20d63..b5d3db5 100644
--- a/404.html
+++ b/404.html
@@ -4,16 +4,15 @@
# MIT License
layout: page
title: "404: Page not found"
-
permalink: /404.html
-redirect_from: # Same as site.blocklist
-- /norobots/
-- /assets/
-- /tabs/
-- /categories/
-- /tags/
-- /posts/
+redirect_from: # part of site.sitemap_exclude
+ - /norobots/
+ - /assets/
+ - /tabs/
+ - /categories/
+ - /tags/
+ - /posts/
dynamic_title: true
---
diff --git a/_config.yml b/_config.yml
index df97e00..276a5e1 100644
--- a/_config.yml
+++ b/_config.yml
@@ -160,12 +160,16 @@ exclude:
- tools
sitemap_exclude: # Sitemap will exclude the following items.
- - /norobots/
- - /assets/
- - /tabs/
- - /categories/
- - /tags/
- - /posts/
- - /404.html
- - /redirects.json
- - /search.json
+ fuzzy:
+ - /assets/
+ accurate:
+ - /norobots/
+ - /tabs/
+ - /categories/
+ - /tags/
+ - /posts/
+ - 404.html
+ - feed.xml
+ - sitemap.xml
+ - robots.txt
+ - redirects.json
diff --git a/sitemap.xml b/sitemap.xml
index d7390ed..0fe8545 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1,5 +1,6 @@
---
layout: compress
+#
# The Sitemap template
# © 2017-2019 Cotes Chung
# MIT License
@@ -41,7 +42,30 @@ layout: compress
{% for page in site.pages %}
- {% if site.sitemap_exclude contains page.url %}
+ {% assign pass = false %}
+
+ {% for fuzzy in site.sitemap_exclude.fuzzy %}
+ {% if page.url contains fuzzy %}
+ {% assign pass = true %}
+ {% break %}
+ {% endif %}
+ {% endfor %}
+
+ {% unless pass %}
+ {% for accurate in site.sitemap_exclude.accurate %}
+ {% assign len = accurate | size %}
+ {% capture beg %}{{ 0 | minus: len }}{% endcapture %}
+ {% capture tail %}{{ page.url | slice: beg, len }}{% endcapture %}
+
+ {% if tail == accurate %}
+ {% assign pass = true %}
+ {% break %}
+ {% endif %}
+
+ {% endfor %}
+ {% endunless %}
+
+ {% if pass %}
{% continue %}
{% endif %}