diff --git src/wp-includes/rest-api.php src/wp-includes/rest-api.php
index 82d856a063..cba8182af4 100644
--- src/wp-includes/rest-api.php
+++ src/wp-includes/rest-api.php
@@ -307,6 +307,8 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) {
 		$path = '/';
 	}
 
+	$path = '/' . ltrim( $path, '/' );
+
 	if ( is_multisite() && get_blog_option( $blog_id, 'permalink_structure' ) || get_option( 'permalink_structure' ) ) {
 		global $wp_rewrite;
 
@@ -316,7 +318,7 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) {
 			$url = get_home_url( $blog_id, rest_get_url_prefix(), $scheme );
 		}
 
-		$url .= '/' . ltrim( $path, '/' );
+		$url .= $path;
 	} else {
 		$url = trailingslashit( get_home_url( $blog_id, '', $scheme ) );
 		// nginx only allows HTTP/1.0 methods when redirecting from / to /index.php
@@ -325,8 +327,6 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) {
 			$url .= 'index.php';
 		}
 
-		$path = '/' . ltrim( $path, '/' );
-
 		$url = add_query_arg( 'rest_route', $path, $url );
 	}
 
diff --git tests/phpunit/tests/rest-api.php tests/phpunit/tests/rest-api.php
index 45c1ccef71..68a07c8899 100644
--- tests/phpunit/tests/rest-api.php
+++ tests/phpunit/tests/rest-api.php
@@ -488,6 +488,33 @@ class Tests_REST_API extends WP_UnitTestCase {
 
 	}
 
+	/**
+	 * @ticket 42452
+	 */
+	public function test_always_prepend_path_with_slash_in_rest_url_filter() {
+		$filter = new MockAction();
+		add_filter( 'rest_url', array( $filter, 'filter' ), 10, 2 );
+
+		// Passing no path should return a slash.
+		get_rest_url();
+		$args = $filter->get_args();
+		$this->assertEquals( '/', $args[0][1] );
+		$filter->reset();
+
+		// Paths without a prepended slash should have one added.
+		get_rest_url( null, 'wp/media/' );
+		$args = $filter->get_args();
+		$this->assertEquals( '/wp/media/', $args[0][1] );
+		$filter->reset();
+
+		// Do not modify paths with a prepended slash.
+		get_rest_url( null, '/wp/media/' );
+		$args = $filter->get_args();
+		$this->assertEquals( '/wp/media/', $args[0][1] );
+
+		unset( $filter );
+	}
+
 	public function jsonp_callback_provider() {
 		return array(
 			// Standard names
