diff --git a/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php b/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php
index b83fe7e130..50b3a57808 100644
--- a/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php
+++ b/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php
@@ -4,10 +4,11 @@
 
 use Drupal\Core\Routing\RouteSubscriberBase;
 use Drupal\Core\Routing\RoutingEvents;
+use Symfony\Component\Routing\Route;
 use Symfony\Component\Routing\RouteCollection;
 
 /**
- * Adds the _admin_route option to each admin route.
+ * Adds the _admin_route option to each admin HTML route.
  */
 class AdminRouteSubscriber extends RouteSubscriberBase {
 
@@ -16,7 +17,7 @@ class AdminRouteSubscriber extends RouteSubscriberBase {
    */
   protected function alterRoutes(RouteCollection $collection) {
     foreach ($collection->all() as $route) {
-      if (strpos($route->getPath(), '/admin') === 0 && !$route->hasOption('_admin_route')) {
+      if (strpos($route->getPath(), '/admin') === 0 && !$route->hasOption('_admin_route') && static::isHtmlRoute($route)) {
         $route->setOption('_admin_route', TRUE);
       }
     }
@@ -36,4 +37,19 @@ public static function getSubscribedEvents() {
     return $events;
   }
 
+  /**
+   * Determines whether the given route is a HTML route.
+   *
+   * @param \Symfony\Component\Routing\Route $route
+   *   The route to analyze.
+   *
+   * @return bool
+   *   TRUE if HTML is a valid format for this route.
+   */
+  protected static function isHtmlRoute(Route $route) {
+    // If a route has no explicit format, then HTML is valid.
+    $format = $route->hasRequirement('_format') ? explode('|', $route->getRequirement('_format')) : ['html'];
+    return in_array('html', $format, TRUE);
+  }
+
 }
diff --git a/core/modules/system/tests/src/Unit/Routing/AdminRouteSubscriberTest.php b/core/modules/system/tests/src/Unit/Routing/AdminRouteSubscriberTest.php
new file mode 100644
index 0000000000..153391c419
--- /dev/null
+++ b/core/modules/system/tests/src/Unit/Routing/AdminRouteSubscriberTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Drupal\Tests\system\Unit\Routing;
+
+use Drupal\Core\Routing\RouteBuildEvent;
+use Drupal\system\EventSubscriber\AdminRouteSubscriber;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * @coversDefaultClass \Drupal\system\EventSubscriber\AdminRouteSubscriber
+ * @group system
+ */
+class AdminRouteSubscriberTest extends UnitTestCase {
+
+  /**
+   * @covers ::alterRoutes
+   * @covers ::isHtmlRoute
+   *
+   * @dataProvider providerTestAlterRoutes
+   */
+  public function testAlterRoutes(Route $route, $is_admin) {
+    $collection = new RouteCollection();
+    $collection->add('the_route', $route);
+    (new AdminRouteSubscriber())->onAlterRoutes(new RouteBuildEvent($collection));
+
+    $this->assertSame($is_admin, $route->getOption('_admin_route'));
+  }
+
+  public function providerTestAlterRoutes() {
+    $data = [];
+    $data['non-admin'] = [
+      new Route('/foo'),
+      NULL,
+    ];
+    $data['admin prefix'] = [
+      new Route('/admin/foo'),
+      TRUE,
+    ];
+    $data['admin option'] = [
+      (new Route('/foo'))
+        ->setOption('_admin_route', TRUE),
+      TRUE,
+    ];
+    $data['admin prefix, non-HTML format'] = [
+      (new Route('/admin/foo'))
+        ->setRequirement('_format', 'json'),
+      NULL,
+    ];
+    $data['admin option, non-HTML format'] = [
+      (new Route('/foo'))
+        ->setRequirement('_format', 'json')
+        ->setOption('_admin_route', TRUE),
+      TRUE,
+    ];
+    $data['admin prefix, HTML format'] = [
+      (new Route('/admin/foo'))
+        ->setRequirement('_format', 'html'),
+      TRUE,
+    ];
+    $data['admin prefix, multi-format including HTML'] = [
+      (new Route('/admin/foo'))
+        ->setRequirement('_format', 'json|html'),
+      TRUE,
+    ];
+    return $data;
+  }
+
+}
