diff --git a/doc/source/install/standalone/enrollment.rst b/doc/source/install/standalone/enrollment.rst
index aa9878209d..3050910702 100644
--- a/doc/source/install/standalone/enrollment.rst
+++ b/doc/source/install/standalone/enrollment.rst
@@ -48,6 +48,9 @@ There are however some limitations for different hardware interfaces:
    modification time, Ironic will re-download the content. For "file://"
    images, the file system modification time is used.
 
+   If the HTTP server does not provide the last modification date and time,
+   the image will be redownloaded every time it is used.
+
 .. _hashlib: https://docs.python.org/3/library/hashlib.html
 
 Enrolling nodes
diff --git a/ironic/drivers/modules/image_cache.py b/ironic/drivers/modules/image_cache.py
index 10d3328d10..fba6fe77e2 100644
--- a/ironic/drivers/modules/image_cache.py
+++ b/ironic/drivers/modules/image_cache.py
@@ -414,20 +414,22 @@ def _delete_master_path_if_stale(master_path, href, ctx):
         img_mtime = img_service.show(href).get('updated_at')
         if not img_mtime:
             # This means that href is not a glance image and doesn't have an
-            # updated_at attribute
+            # updated_at attribute. To play on the safe side, redownload the
+            # master copy of the image.
             LOG.warning("Image service couldn't determine last "
-                        "modification time of %(href)s, considering "
-                        "cached image up to date.", {'href': href})
-            return True
-        master_mtime = utils.unix_file_modification_datetime(master_path)
-        if img_mtime <= master_mtime:
-            return True
-        # Delete image from cache as it is outdated
-        LOG.info('Image %(href)s was last modified at %(remote_time)s. '
-                 'Deleting the cached copy "%(cached_file)s since it was '
-                 'last modified at %(local_time)s and may be outdated.',
-                 {'href': href, 'remote_time': img_mtime,
-                  'local_time': master_mtime, 'cached_file': master_path})
+                        "modification time of %(href)s, updating "
+                        "the cached copy %(cached_file)s.",
+                        {'href': href, 'cached_file': master_path})
+        else:
+            master_mtime = utils.unix_file_modification_datetime(master_path)
+            if img_mtime <= master_mtime:
+                return True
+            # Delete image from cache as it is outdated
+            LOG.info('Image %(href)s was last modified at %(remote_time)s. '
+                     'Deleting the cached copy "%(cached_file)s since it was '
+                     'last modified at %(local_time)s and may be outdated.',
+                     {'href': href, 'remote_time': img_mtime,
+                      'local_time': master_mtime, 'cached_file': master_path})
 
         os.unlink(master_path)
     return False
diff --git a/ironic/tests/unit/drivers/modules/test_image_cache.py b/ironic/tests/unit/drivers/modules/test_image_cache.py
index 994d3a214e..51e36cd193 100644
--- a/ironic/tests/unit/drivers/modules/test_image_cache.py
+++ b/ironic/tests/unit/drivers/modules/test_image_cache.py
@@ -298,8 +298,8 @@ class TestUpdateImages(base.TestCase):
         res = image_cache._delete_master_path_if_stale(self.master_path, href,
                                                        None)
         mock_gis.assert_called_once_with(href, context=None)
-        self.assertFalse(mock_unlink.called)
-        self.assertTrue(res)
+        mock_unlink.assert_called_once_with(self.master_path)
+        self.assertFalse(res)
 
     @mock.patch.object(image_service, 'get_image_service', autospec=True)
     def test__delete_master_path_if_stale_master_up_to_date(self, mock_gis,
diff --git a/releasenotes/notes/image-cache-4082178dabd64249.yaml b/releasenotes/notes/image-cache-4082178dabd64249.yaml
new file mode 100644
index 0000000000..b635015703
--- /dev/null
+++ b/releasenotes/notes/image-cache-4082178dabd64249.yaml
@@ -0,0 +1,8 @@
+---
+fixes:
+  - |
+    When an ``http(s)://`` image is used, the cached copy of the image will always
+    be updated if the HTTP server does not provide the last modification date
+    and time. Previously the cached image would be considered up-to-date, which
+    could cause invalid behavior if the image is generated on fly or was modified
+    while being served.