diff --git a/core/lib/Drupal/Core/Routing/RouteProvider.php b/core/lib/Drupal/Core/Routing/RouteProvider.php
index 9c660e8..ee38d79 100644
--- a/core/lib/Drupal/Core/Routing/RouteProvider.php
+++ b/core/lib/Drupal/Core/Routing/RouteProvider.php
@@ -222,22 +222,26 @@ public function getCandidateOutlines(array $parts) {
   /**
    * {@inheritdoc}
    */
-  public function getRoutesByPattern($pattern) {
-    $path = RouteCompiler::getPatternOutline($pattern);
+  public function getRoutesByExactPattern($pattern) {
+    $outline = RouteCompiler::getPatternOutline($pattern);
 
-    return $this->getRoutesByPath($path);
+    $routes = $this->connection->query("SELECT name, route FROM {" . $this->connection->escapeTable($this->tableName) . "} WHERE pattern_outline = :outline ORDER BY fit DESC", array(
+      ':outline' => $outline,
+    ))
+      ->fetchAllKeyed();
+    $collection = new RouteCollection();
+    foreach ($routes as $name => $route) {
+      $route = unserialize($route);
+      $collection->add($name, $route);
+    }
+
+    return $collection;
   }
 
   /**
-   * Get all routes which match a certain pattern.
-   *
-   * @param string $path
-   *   The route pattern to search for (contains % as placeholders).
-   *
-   * @return \Symfony\Component\Routing\RouteCollection
-   *   Returns a route collection of matching routes.
+   * {@inheritdoc}
    */
-  protected function getRoutesByPath($path) {
+  public function getRoutesByPath($path) {
     // Filter out each empty value, though allow '0' and 0, which would be
     // filtered out by empty().
     $parts = array_slice(array_filter(explode('/', $path), function($value) {
diff --git a/core/lib/Drupal/Core/Routing/RouteProviderInterface.php b/core/lib/Drupal/Core/Routing/RouteProviderInterface.php
index aa0375f..0db254d 100644
--- a/core/lib/Drupal/Core/Routing/RouteProviderInterface.php
+++ b/core/lib/Drupal/Core/Routing/RouteProviderInterface.php
@@ -18,7 +18,10 @@
 interface RouteProviderInterface extends RouteProviderBaseInterface {
 
   /**
-   * Get all routes which match a certain pattern.
+   * Get all routes which match exactly the given pattern.
+   *
+   * This method does not return something if you do specify actual values
+   * for placeholders.
    *
    * @param string $pattern
    *   The route pattern to search for (contains {} as placeholders).
@@ -26,6 +29,20 @@
    * @return \Symfony\Component\Routing\RouteCollection
    *   Returns a route collection of matching routes.
    */
-  public function getRoutesByPattern($pattern);
+  public function getRoutesByExactPattern($pattern);
+
+  /**
+   * Get all routes which match a certain path.
+   *
+   * This method does return something if you specify values for the
+   * placeholders.
+   *
+   * @param string $path
+   *   The route path to match (a concrete path with no placeholders).
+   *
+   * @return \Symfony\Component\Routing\RouteCollection
+   *   Returns a route collection of matching routes.
+   */
+  public function getRoutesByPath($path);
 
 }
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
index f7da9a7..47f910e 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -94,7 +94,7 @@ public function alterLocalTasks(array &$local_tasks) {
     foreach ($this->entityManager->getDefinitions() as $entity_type => $entity_info) {
       if (!empty($entity_info['translatable']) && !empty($entity_info['links']['canonical'])) {
         $path = $entity_info['links']['canonical'];
-        if ($routes = $this->routeProvider->getRoutesByPattern($path)->all()) {
+        if ($routes = $this->routeProvider->getRoutesByExactPattern($path)->all()) {
           // Find the route name for the entity page.
           $entity_route_name = key($routes);
 
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index 724309c..5874ad6 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -389,7 +389,7 @@ function shortcut_valid_link($path) {
   }
 
   // An empty path is valid too and will be converted to <front>.
-  return (!url_is_external($path) && (\Drupal::service('router.route_provider')->getRoutesByPattern('/' . $path)->count() > 0 || menu_get_item($path))) || empty($path) || $path == '<front>';
+  return (!url_is_external($path) && (\Drupal::service('router.route_provider')->getRoutesByPath('/' . $path)->count() > 0 || menu_get_item($path))) || empty($path) || $path == '<front>';
 }
 
 /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/MockRouteProvider.php b/core/modules/system/lib/Drupal/system/Tests/Routing/MockRouteProvider.php
index e0ed543..2337d1a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/MockRouteProvider.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/MockRouteProvider.php
@@ -71,8 +71,29 @@ public function getRoutesByNames($names, $parameters = array()) {
   /**
    * {@inheritdoc}
    */
-  public function getRoutesByPattern($pattern) {
-    return new RouteCollection();
+  public function getRoutesByExactPattern($pattern) {
+    $collection = new RouteCollection();
+    foreach ($this->routes->all() as $name => $route) {
+      if ($route->getPath() == $pattern) {
+        $collection->add($name, $route);
+      }
+    }
+
+    return $collection;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRoutesByPath($path) {
+    $collection = new RouteCollection();
+    foreach ($this->routes->all() as $name => $route) {
+      if (preg_match($route->compile()->getRegex(), $path, $matches)) {
+        $collection->add($name, $route);
+      }
+    }
+
+    return $collection;
   }
 
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/RouteProviderTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/RouteProviderTest.php
index 1eafdf6..6718be8 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/RouteProviderTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/RouteProviderTest.php
@@ -326,7 +326,7 @@ function testOutlinePathNoMatch() {
     $request = Request::create($path, 'GET');
 
     try {
-      $routes = $provider->getRoutesByPattern($path);
+      $routes = $provider->getRoutesByPath($path);
       $this->assertFalse(count($routes), 'No path found with this pattern.');
 
       $provider->getRouteCollectionForRequest($request);
@@ -353,7 +353,7 @@ function testSystemPathMatch() {
     $request = Request::create('/path/one', 'GET');
     $request->attributes->set('_system_path', 'path/two');
 
-    $routes_by_pattern = $provider->getRoutesByPattern('/path/two');
+    $routes_by_pattern = $provider->getRoutesByExactPattern('/path/two');
     $routes = $provider->getRouteCollectionForRequest($request);
     $this->assertEqual(array_keys($routes_by_pattern->all()), array_keys($routes->all()), 'Ensure the expected routes are found.');
 
