--- a/src/EventSubscriber/RedirectPathTranslatorSubscriber.php
+++ b/src/EventSubscriber/RedirectPathTranslatorSubscriber.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\decoupled_router\PathTranslatorEvent;
 use Drupal\path_alias\AliasManagerInterface;
+use Drupal\redirect\Exception\RedirectLoopException;
 use Drupal\redirect\RedirectRepository;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\Attribute\Autowire;
@@ -104,22 +105,36 @@
     // Try to find redirect with decoded path first.
     // This handles encoded URLs like Arabic characters.
     $decoded_source_path = urldecode($source_path);
-    $redirect = $this->redirectRepository->findMatchingRedirect(
-      $decoded_source_path,
-      $request_query,
-      $this->langcode ?? $this->languageManager->getCurrentLanguage()->getId(),
-      $cacheable_metadata
-    );
-
-    // If not found with decoded path, try with original encoded path.
-    if (!$redirect) {
+    try {
       $redirect = $this->redirectRepository->findMatchingRedirect(
-        $source_path,
+        $decoded_source_path,
         $request_query,
         $this->langcode ?? $this->languageManager->getCurrentLanguage()->getId(),
         $cacheable_metadata
       );
+
+      // If not found with decoded path, try with original encoded path.
+      if (!$redirect) {
+        $redirect = $this->redirectRepository->findMatchingRedirect(
+          $source_path,
+          $request_query,
+          $this->langcode ?? $this->languageManager->getCurrentLanguage()->getId(),
+          $cacheable_metadata
+        );
+      }
     }
+    catch (RedirectLoopException $e) {
+      // A redirect loop in the chain would otherwise bubble up and turn the
+      // whole translate-path response into a 500. Log it (mirroring
+      // RedirectRequestSubscriber) and fall through to the route-level
+      // translator so the path resolves as if no redirect existed.
+      $this->logger->warning('Redirect loop identified at %path for redirect %rid. Redirect resolution skipped.', [
+        '%path' => $e->getPath(),
+        '%rid' => $e->getRedirectId(),
+      ]);
+      $response->addCacheableDependency($cacheable_metadata);
+      return;
+    }
 
     if (!$redirect) {
       return;
