diff --git a/html/class_passwordRecovery.inc b/html/class_passwordRecovery.inc
index 94c42913dc9e0e37052daf3285c5ec1d8daf7863..5f95dc3e7d2837c2c9601a714c22198249a1de57 100644
--- a/html/class_passwordRecovery.inc
+++ b/html/class_passwordRecovery.inc
@@ -151,20 +151,16 @@ class standAlonePage {
     $smarty = get_smarty();
 
     /* Check for SSL connection */
-    $ssl = "";
-    $smarty->assign("ssl", "");
-    if (!isset($_SERVER['HTTPS']) || !stristr($_SERVER['HTTPS'], "on")) {
-      if (empty($_SERVER['REQUEST_URI'])) {
-        $ssl = "https://".$_SERVER['HTTP_HOST'].$_SERVER['PATH_INFO'];
-      } else {
-        $ssl = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
-      }
+    $ssl = '';
+    $smarty->assign('ssl', '');
+    if (!sslOn()) {
+      $ssl = sslUrl();
 
       /* If SSL is forced, just forward to the SSL enabled site */
-      if ($config->get_cfg_value("forcessl") == 'TRUE') {
+      if ($config->get_cfg_value('forcessl') == 'TRUE') {
         header("Location: $ssl");
         exit;
-      } elseif ($config->get_cfg_value("warnssl") == 'TRUE') {
+      } elseif ($config->get_cfg_value('warnssl') == 'TRUE') {
         /* Display SSL mode warning? */
         $smarty->assign ('ssl', sprintf(_('Warning: <a href="%s">Session is not encrypted!</a>'), $ssl));
       }
@@ -175,20 +171,30 @@ class standAlonePage {
 
   function getPageURL()
   {
-    $pageURL = "http";
-    if (isset($_SERVER['HTTPS']) && ($_SERVER["HTTPS"] == "on")) {
-      $pageURL .= "s";
+    $protocol = 'http';
+    if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) {
+      $protocol .= 's';
     }
-    $pageURL .= '://';
+    $port = '80';
     if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
-      $pageURL .= $_SERVER['HTTP_X_FORWARDED_HOST'];
-    } else {
-      $pageURL .= $_SERVER['SERVER_NAME'];
-      if ($_SERVER['SERVER_PORT'] != '80') {
-        $pageURL .= ':'.$_SERVER['SERVER_PORT'];
+      $host = $_SERVER['HTTP_X_FORWARDED_HOST'];
+      if (isset($_SERVER['HTTP_X_FORWARDED_PORT'])) {
+        $port = $_SERVER['HTTP_X_FORWARDED_PORT'];
+      }
+      if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+        $protocol = $_SERVER['HTTP_X_FORWARDED_PROTO'];
       }
+    } else {
+      $host = $_SERVER['SERVER_NAME'];
+      $port = $_SERVER['SERVER_PORT'];
+    }
+
+    $pageURL = $protocol.'://';
+    $pageURL .= $host;
+    if ($port != '80') {
+      $pageURL .= ':'.$port;
     }
-    $pageURL .= $_SERVER["PHP_SELF"];
+    $pageURL .= $_SERVER['PATH_INFO'];
 
     return $pageURL;
   }
diff --git a/include/php_setup.inc b/include/php_setup.inc
index ab52ff33b420620fda345c941641bc1a2187fd92..c7901d14e4c6331e97595fe74a699c0a324ab511 100644
--- a/include/php_setup.inc
+++ b/include/php_setup.inc
@@ -273,6 +273,37 @@ function dummy_error_handler()
 {
 }
 
+/*! \brief Returns TRUE if SSLĂ‚ was used to contact FD, whether directly or through a proxy
+ */
+function sslOn()
+{
+  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+    return (strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') == 0);
+  }
+  if (isset($_SERVER['HTTPS'])) {
+    return (strcasecmp($_SERVER['HTTPS'], 'on') == 0);
+  }
+  return FALSE;
+}
+
+/*! \brief Returns SSL URL to redirect to
+ */
+function sslUrl()
+{
+  $ssl = 'https://';
+  if (empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
+    $ssl .= $_SERVER['HTTP_HOST'];
+  } else {
+    $ssl .= $_SERVER['HTTP_X_FORWARDED_HOST'];
+  }
+  if (empty($_SERVER['REQUEST_URI'])) {
+    $ssl .= $_SERVER['PATH_INFO'];
+  } else {
+    $ssl .= $_SERVER['REQUEST_URI'];
+  }
+  return $ssl;
+}
+
 /* Bail out for incompatible/old PHP versions */
 if (!version_compare(phpversion(), PHP_MIN_VERSION, ">=")) {
   echo "PHP version needs to be ".PHP_MIN_VERSION." or above to run FusionDirectory. Aborted.";
@@ -312,12 +343,8 @@ $smarty->assign('js_files', array());
 $smarty->php_handling = Smarty::PHP_REMOVE;
 
 /* Check for SSL connection */
-$ssl = "";
-if (!(isset($_SERVER['HTTPS']) && stristr($_SERVER['HTTPS'], "on"))) {
-  if (empty($_SERVER['REQUEST_URI'])) {
-    $ssl = "https://".$_SERVER['HTTP_HOST'].$_SERVER['PATH_INFO'];
-  } else {
-    $ssl = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
-  }
+$ssl = '';
+if (!sslOn()) {
+  $ssl = sslUrl();
 }
 ?>