Index: kernel/classes/ezsslzone.php
===================================================================
--- kernel/classes/ezsslzone.php	(revision 23546)
+++ kernel/classes/ezsslzone.php	(working copy)
@@ -273,7 +273,7 @@
         if ( $sslZoneRedirectionURL ) // if a redirection URL is found
         {
             eZDebugSetting::writeDebug( 'kernel-ssl-zone', "redirecting to [$sslZoneRedirectionURL]" );
-            eZHTTPTool::redirect( $sslZoneRedirectionURL );
+            eZHTTPTool::redirect( $sslZoneRedirectionURL, array(), false, false );
             eZExecution::cleanExit();
         }
     }
Index: lib/ezutils/classes/ezhttptool.php
===================================================================
--- lib/ezutils/classes/ezhttptool.php	(revision 23546)
+++ lib/ezutils/classes/ezhttptool.php	(working copy)
@@ -592,7 +592,18 @@
         return $uri;
     }
 
-    static function redirect( $path, $parameters = array(), $status = false )
+    /**
+     * \static
+     * Performs an HTTP redirect.
+     *
+     * \param  $path  The path to redirect
+     * \param  $parameters  \see createRedirectUrl()
+     * \param  $status  The HTTP status code as a string
+     * \param  $encodeURL  Encode the URL. This should normally be true, but
+     * may be set to false to avoid double encoding when redirect() is called
+     * twice.
+     */
+    static function redirect( $path, $parameters = array(), $status = false, $encodeURL = true )
     {
         $url = eZHTTPTool::createRedirectUrl( $path, $parameters );
         if ( strlen( $status ) > 0 )
@@ -601,7 +612,10 @@
             eZHTTPTool::headerVariable( "Status", $status );
         }
 
-        $url = eZURI::encodeURL( $url );
+        if ( $encodeURL )
+        {
+            $url = eZURI::encodeURL( $url );
+        }
 
         eZHTTPTool::headerVariable( 'Location', $url );
 
