diff --git a/src/wp-includes/canonical.php b/src/wp-includes/canonical.php
index a02ab793cee3..68a33255b821 100644
--- a/src/wp-includes/canonical.php
+++ b/src/wp-includes/canonical.php
@@ -63,10 +63,22 @@ function redirect_canonical( $requested_url = null, $do_redirect = true ) {
 		return;
 	}
 
-	if ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) {
+	// www.example.com vs. example.com
+	$user_home = parse_url( home_url('/') );
+
+	if ( ! $requested_url ) {
 		// Build the URL in the address bar.
-		$requested_url  = is_ssl() ? 'https://' : 'http://';
-		$requested_url .= $_SERVER['HTTP_HOST'];
+		$requested_url = is_ssl() ? 'https://' : 'http://';
+		if ( isset( $_SERVER['HTTP_HOST'] ) ) {
+			$requested_url .= $_SERVER['HTTP_HOST'];
+		} else {
+			// Fallback for http1.0 where requested host and port are unknown
+			// In this case correct redirect no-www <=> yes-www is not possible
+			$requested_url .= $user_home['host'];
+			if ( ! empty( $user_home['port'] ) ) {
+				$requested_url .= ':' . $user_home['port'];
+			}
+		}
 		$requested_url .= $_SERVER['REQUEST_URI'];
 	}
 
@@ -570,9 +582,6 @@ function redirect_canonical( $requested_url = null, $do_redirect = true ) {
 		$redirect = parse_url( $redirect_url );
 	}
 
-	// www.example.com vs. example.com
-	$user_home = parse_url( home_url() );
-
 	if ( ! empty( $user_home['host'] ) ) {
 		$redirect['host'] = $user_home['host'];
 	}
