diff --git a/src/api/icons.rs b/src/api/icons.rs
index 5abcf375f8cbd4afbb1283d0d6c76b7cc85e191f..14cfa25f98c22d44c5b47b6a2e87b7b008b9e977 100644
--- a/src/api/icons.rs
+++ b/src/api/icons.rs
@@ -51,7 +51,7 @@ fn icon(domain: String) -> Option<Cached<Content<Vec<u8>>>> {
         return None;
     }
 
-    get_icon(&domain).map(|icon| Cached::long(Content(ContentType::new("image", "x-icon"), icon)))
+    get_icon(&domain).map(|icon| Cached::ttl(Content(ContentType::new("image", "x-icon"), icon), CONFIG.icon_cache_ttl()))
 }
 
 /// Returns if the domain provided is valid or not.
@@ -472,7 +472,7 @@ fn get_icon_url(domain: &str) -> Result<IconUrlResult, Error> {
         let dom = html5ever::parse_document(markup5ever_rcdom::RcDom::default(), Default::default())
             .from_utf8()
             .read_from(&mut limited_reader)?;
-    
+
         get_favicons_node(&dom.document, &mut iconlist, &url);
     } else {
         // Add the default favicon.ico to the list with just the given domain
diff --git a/src/util.rs b/src/util.rs
index de663583cc8b3a60984b61e9aacede747145689e..40256eb7d67dde699d470793c6b3ee1f12b4337e 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -92,17 +92,21 @@ impl Fairing for CORS {
     }
 }
 
-pub struct Cached<R>(R, &'static str);
+pub struct Cached<R>(R, String);
 
 impl<R> Cached<R> {
-    pub const fn long(r: R) -> Cached<R> {
+    pub fn long(r: R) -> Cached<R> {
         // 7 days
-        Self(r, "public, max-age=604800")
+        Self::ttl(r, 604800)
     }
 
-    pub const fn short(r: R) -> Cached<R> {
+    pub fn short(r: R) -> Cached<R> {
         // 10 minutes
-        Self(r, "public, max-age=600")
+        Self(r, String::from("public, max-age=600"))
+    }
+
+    pub fn ttl(r: R, ttl: u64) -> Cached<R> {
+        Self(r, format!("public, immutable, max-age={}", ttl))
     }
 }