diff --git a/src/EventSubscriber/RouteNormalizerRequestSubscriber.php b/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
index caed6fd..ba17565 100644
--- a/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
+++ b/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
@@ -98,12 +98,14 @@ class RouteNormalizerRequestSubscriber implements EventSubscriberInterface {
       // The "<current>" placeholder can be used for all routes except the front
       // page because it's not a real route.
       $route_name = $this->pathMatcher->isFrontPage() ? '<front>' : '<current>';
-      $options = [
-        'query' => $request->query->all(),
-        'absolute' => TRUE,
-      ];
+      $options = ['absolute' => TRUE];
       $redirect_uri = $this->urlGenerator->generateFromRoute($route_name, [], $options);
 
+      // Append the original query string.
+      if ($query_string = $request->server->get('QUERY_STRING')) {
+        $redirect_uri = $redirect_uri . '?' . $query_string;
+      }
+
       // Remove /index.php from redirect uri the hard way.
       if (!RequestHelper::isCleanUrl($request)) {
         // This needs to be fixed differently.
diff --git a/src/Tests/GlobalRedirectTest.php b/src/Tests/GlobalRedirectTest.php
index fcf129c..2a77df1 100644
--- a/src/Tests/GlobalRedirectTest.php
+++ b/src/Tests/GlobalRedirectTest.php
@@ -190,6 +190,9 @@ class GlobalRedirectTest extends WebTestBase {
 
     // Test alias normalization again with ignore_admin_path true.
     $this->assertRedirect('Test-node', 'test-node');
+
+    // Test alias normalization to ensure original query string is preserved.
+    $this->assertRedirect('Test-node?&foo&.bar=baz', 'test-node?&foo&.bar=baz');
   }
 
   /**
