Index: src/wp-includes/ms-blogs.php
===================================================================
--- src/wp-includes/ms-blogs.php	(revision 33515)
+++ src/wp-includes/ms-blogs.php	(working copy)
@@ -124,7 +124,8 @@
 				$nowww = substr( $fields['domain'], 4 );
 				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'], $fields['path'] ) );
 			} else {
-				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $fields['domain'], $fields['path'] ) );
+				$www = "www.{$fields['domain']}";
+				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) ASC", $fields['domain'], $www, $fields['path'] ) );
 			}
 			if ( $blog ) {
 				wp_cache_set($blog->blog_id . 'short', $blog, 'blog-details');
@@ -141,7 +142,8 @@
 				$nowww = substr( $fields['domain'], 4 );
 				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'] ) );
 			} else {
-				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s", $fields['domain'] ) );
+				$www = "www.{$fields['domain']}";
+				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) ORDER BY CHAR_LENGTH(domain) ASC", $fields['domain'], $www ) );
 			}
 			if ( $blog ) {
 				wp_cache_set($blog->blog_id . 'short', $blog, 'blog-details');
Index: tests/phpunit/tests/multisite/site.php
===================================================================
--- tests/phpunit/tests/multisite/site.php	(revision 33515)
+++ tests/phpunit/tests/multisite/site.php	(working copy)
@@ -770,6 +770,51 @@
 	}
 
 	/**
+	 * Ensure that we find the blog we want, regardless of www. prefix.
+	 *
+	 * @ticket 21837
+	 */
+	function test_get_blog_details_www_nowww() {
+		$network_ids = array(
+			'example.test/' => array(
+				'domain' => 'example.test',
+				'path'   => '/',
+				),
+		);
+
+		foreach ( $network_ids as &$id ) {
+			$id = $this->factory->network->create( $id );
+		}
+		unset( $id );
+
+		$ids = array(
+			'no-www.test/'   => array( 'domain' => 'no-www.test',   'path' => '/', 'title' => 'No WWW',   'site_id' => $network_ids['example.test/'] ),
+			'www.with.test/' => array( 'domain' => 'www.with.test', 'path' => '/', 'title' => 'With WWW', 'site_id' => $network_ids['example.test/'] ),
+		);
+
+		foreach ( $ids as &$id ) {
+			$id = $this->factory->blog->create( $id );
+		}
+		unset( $id );
+
+		$site = get_blog_details( array( 'domain' => 'no-www.test' ) );
+		$this->assertEquals( $ids['no-www.test/'], $site->blog_id );
+		$this->assertEquals( 'No WWW', $site->blogname );
+
+		$site = get_blog_details( array( 'domain' => 'www.no-www.test' ) );
+		$this->assertEquals( $ids['no-www.test/'], $site->blog_id );
+		$this->assertEquals( 'No WWW', $site->blogname );
+
+		$site = get_blog_details( array( 'domain' => 'with.test' ) );
+		$this->assertEquals( $ids['www.with.test/'], $site->blog_id );
+		$this->assertEquals( 'With WWW', $site->blogname );
+
+		$site = get_blog_details( array( 'domain' => 'www.with.test' ) );
+		$this->assertEquals( $ids['www.with.test/'], $site->blog_id );
+		$this->assertEquals( 'With WWW', $site->blogname );
+	}
+
+	/**
 	 * Test the original and cached responses for a created and then deleted site when
 	 * the blog ID is requested through get_blog_id_from_url().
 	 */
