diff --git a/core/lib/Drupal/Component/HttpFoundation/SecuredRedirectResponse.php b/core/lib/Drupal/Component/HttpFoundation/SecuredRedirectResponse.php
index 77c978c..66cbf36 100644
--- a/core/lib/Drupal/Component/HttpFoundation/SecuredRedirectResponse.php
+++ b/core/lib/Drupal/Component/HttpFoundation/SecuredRedirectResponse.php
@@ -33,12 +33,19 @@
    */
   public static function createFromRedirectResponse(RedirectResponse $response) {
     $safe_response = new static($response->getTargetUrl(), $response->getStatusCode(), $response->headers->allPreserveCase());
-    $safe_response->setProtocolVersion($response->getProtocolVersion());
-    $safe_response->setCharset($response->getCharset());
+    $safe_response->fromResponse($response);
     return $safe_response;
   }
 
   /**
+   * Copies over the values from the given response.
+   */
+  protected function fromResponse(RedirectResponse $response) {
+    $this->setProtocolVersion($response->getProtocolVersion());
+    $this->setCharset($response->getCharset());
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function setTargetUrl($url) {
diff --git a/core/lib/Drupal/Core/Cache/CacheableRedirectResponse.php b/core/lib/Drupal/Core/Cache/CacheableRedirectResponse.php
new file mode 100644
index 0000000..07d9831
--- /dev/null
+++ b/core/lib/Drupal/Core/Cache/CacheableRedirectResponse.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Cache\CacheableRedirectResponse.
+ */
+
+namespace Drupal\Core\Cache;
+
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+/**
+ * A RedirectResponse that contains and can expose cacheability metadata.
+ *
+ * Supports Drupal's caching concepts: cache tags for invalidation and cache
+ * contexts for variations.
+ *
+ * @see \Drupal\Core\Cache\Cache
+ * @see \Drupal\Core\Cache\CacheableMetadata
+ * @see \Drupal\Core\Cache\CacheableResponseTrait
+ */
+class CacheableRedirectResponse extends RedirectResponse implements CacheableResponseInterface {
+
+  use CacheableResponseTrait;
+
+}
diff --git a/core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php
index 51ebbc2..84bdda1 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\EventSubscriber;
 
-use Symfony\Component\HttpFoundation\RedirectResponse;
+use Drupal\Core\Cache\CacheableRedirectResponse;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -39,7 +39,7 @@ public function redirect(GetResponseEvent $event) {
       if ($qs) {
         $qs = '?' . $qs;
       }
-      $event->setResponse(new RedirectResponse($request->getUriForPath($path) . $qs));
+      $event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
     }
   }
 
diff --git a/core/lib/Drupal/Core/Routing/CacheableSecuredRedirectResponse.php b/core/lib/Drupal/Core/Routing/CacheableSecuredRedirectResponse.php
new file mode 100644
index 0000000..c8d0244
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/CacheableSecuredRedirectResponse.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\CacheableSecuredRedirectResponse.
+ */
+
+namespace Drupal\Core\Routing;
+
+use Drupal\Component\HttpFoundation\SecuredRedirectResponse;
+use Drupal\Core\Cache\CacheableResponseInterface;
+use Drupal\Core\Cache\CacheableResponseTrait;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+/**
+ * Provides a common base class for cacheable safe redirects.
+ */
+abstract class CacheableSecuredRedirectResponse extends SecuredRedirectResponse implements CacheableResponseInterface {
+
+  use CacheableResponseTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function fromResponse(RedirectResponse $response) {
+    parent::fromResponse($response);
+
+    $metadata = $this->getCacheableMetadata();
+    if ($response instanceof CacheableResponseInterface) {
+      $metadata->addCacheableDependency($response->getCacheableMetadata());
+    }
+    else {
+      $metadata->setCacheMaxAge(0);
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Routing/LocalRedirectResponse.php b/core/lib/Drupal/Core/Routing/LocalRedirectResponse.php
index d8ad719..4d0e275 100644
--- a/core/lib/Drupal/Core/Routing/LocalRedirectResponse.php
+++ b/core/lib/Drupal/Core/Routing/LocalRedirectResponse.php
@@ -7,12 +7,10 @@
 
 namespace Drupal\Core\Routing;
 
-use Drupal\Component\HttpFoundation\SecuredRedirectResponse;
-
 /**
  * Provides a redirect response which cannot redirect to an external URL.
  */
-class LocalRedirectResponse extends SecuredRedirectResponse {
+class LocalRedirectResponse extends CacheableSecuredRedirectResponse {
 
   use LocalAwareRedirectResponseTrait {
     LocalAwareRedirectResponseTrait::isLocal as isSafe;
diff --git a/core/lib/Drupal/Core/Routing/TrustedRedirectResponse.php b/core/lib/Drupal/Core/Routing/TrustedRedirectResponse.php
index c7a43a2..3beb176 100644
--- a/core/lib/Drupal/Core/Routing/TrustedRedirectResponse.php
+++ b/core/lib/Drupal/Core/Routing/TrustedRedirectResponse.php
@@ -7,14 +7,12 @@
 
 namespace Drupal\Core\Routing;
 
-use Drupal\Component\HttpFoundation\SecuredRedirectResponse;
-
 /**
  * Provides a redirect response which contains trusted URLs.
  *
  * Use this class in case you know that you want to redirect to an external URL.
  */
-class TrustedRedirectResponse extends SecuredRedirectResponse {
+class TrustedRedirectResponse extends CacheableSecuredRedirectResponse {
 
   use LocalAwareRedirectResponseTrait;
 
diff --git a/core/tests/Drupal/Tests/Core/Routing/TrustedRedirectResponseTest.php b/core/tests/Drupal/Tests/Core/Routing/TrustedRedirectResponseTest.php
index 4ac1333..2414798 100644
--- a/core/tests/Drupal/Tests/Core/Routing/TrustedRedirectResponseTest.php
+++ b/core/tests/Drupal/Tests/Core/Routing/TrustedRedirectResponseTest.php
@@ -7,10 +7,14 @@
 
 namespace Drupal\Tests\Core\Routing;
 
+use Drupal\Core\Cache\CacheableMetadata;
+use Drupal\Core\Cache\CacheableRedirectResponse;
+use Drupal\Core\Cache\CacheableResponseInterface;
 use Drupal\Core\Routing\RequestContext;
 use Drupal\Core\Routing\TrustedRedirectResponse;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpFoundation\RedirectResponse;
 
 /**
  * @coversDefaultClass \Drupal\Core\Routing\TrustedRedirectResponse
@@ -54,4 +58,32 @@ public function testSetTargetUrlWithTrustedUrl() {
     $this->assertEquals('http://good-external-url.com/example', $redirect_response->getTargetUrl());
   }
 
+  /**
+   * @covers ::createFromRedirectResponse
+   * @dataProvider providerCreateFromRedirectResponse
+   */
+  public function testCreateFromRedirectResponse($redirect_response) {
+    $trusted_redirect_response = TrustedRedirectResponse::createFromRedirectResponse($redirect_response);
+
+    // The trusted redirect response is always a CacheableResponseInterface instance.
+    $this->assertTrue($trusted_redirect_response instanceof CacheableResponseInterface);
+
+    // But it is only actually cacheable (non-zero max-age) if the redirect
+    // response passed to TrustedRedirectResponse::createFromRedirectResponse()
+    // is itself cacheable.
+    $expected_cacheability = ($redirect_response instanceof CacheableResponseInterface) ? $redirect_response->getCacheableMetadata() : (new CacheableMetadata())->setCacheMaxAge(0);
+    $this->assertEquals($expected_cacheability, $trusted_redirect_response->getCacheableMetadata());
+  }
+
+  /**
+   * @return array
+   */
+  public function providerCreateFromRedirectResponse() {
+    return [
+      'cacheable-with-tags' => [(new CacheableRedirectResponse('/example'))->addCacheableDependency((new CacheableMetadata())->addCacheTags(['foo']))],
+      'cacheable-with-max-age-0' => [(new CacheableRedirectResponse('/example'))->addCacheableDependency((new CacheableMetadata())->setCacheMaxAge(0))],
+      'uncacheable' => [new RedirectResponse('/example')],
+    ];
+  }
+
 }
