class_URL.inc 3.59 KiB
<?php
/*
  This code is part of FusionDirectory (http://www.fusiondirectory.org/)
  Copyright (C) 2018-2019  FusionDirectory
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
/*!
 * \brief Class URL
 * Static methods to get/build URLs
class URL
  /*! \brief Returns TRUE if SSL was used to contact FD, whether directly or through a proxy
  public static function sslOn (): bool
    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;
  protected static function gatherInfos (): array
    $protocol = 'http';
    if (static::sslOn()) {
      $protocol .= 's';
    if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
      $host = $_SERVER['HTTP_X_FORWARDED_HOST'];
      if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
        $protocol = $_SERVER['HTTP_X_FORWARDED_PROTO'];
      if (isset($_SERVER['HTTP_X_FORWARDED_PORT'])) {
        $port = $_SERVER['HTTP_X_FORWARDED_PORT'];
      } else {
        $port = ($protocol === 'http' ? 80 : 443);
    } else {
      if (!empty($_SERVER['HTTP_HOST'])) {
        $host = $_SERVER['HTTP_HOST'];
      } else {
        $host = $_SERVER['SERVER_NAME'];
      $port = $_SERVER['SERVER_PORT'];
    return [$protocol, $host, $port];
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
/*! \brief Returns SSL URL to redirect to */ public static function getSslUrl (): string { list(, $host, $port) = static::gatherInfos(); $ssl = 'https://'.$host; if (!empty($_SERVER['REQUEST_URI'])) { $ssl .= $_SERVER['REQUEST_URI']; } elseif (!empty($_SERVER['PATH_INFO'])) { $ssl .= $_SERVER['PATH_INFO']; } else { $ssl .= $_SERVER['PHP_SELF']; } return $ssl; } /*! \brief Returns current page URL */ public static function getPageURL ($queryString = FALSE): string { list($protocol, $host, $port) = static::gatherInfos(); $pageURL = $protocol.'://'.$host; if ((($protocol == 'http') && ($port != '80')) || (($protocol == 'https') && ($port != '443'))) { $pageURL .= ':'.$port; } if (!empty($_SERVER['REQUEST_URI']) && $queryString) { $pageURL .= $_SERVER['REQUEST_URI']; } elseif (!empty($_SERVER['PATH_INFO'])) { $pageURL .= $_SERVER['PATH_INFO']; } else { $pageURL .= $_SERVER['PHP_SELF']; } return $pageURL; } /*! \brief Returns hostname to identify this website */ public static function getHostName (): string { list($protocol, $host, $port) = static::gatherInfos(); if ((($protocol == 'http') && ($port != '80')) || (($protocol == 'https') && ($port != '443'))) { $host .= ':'.$port; } return $host; } /*! \brief Returns absolute URL from relative URL */ public static function buildAbsoluteUrl (string $path): string { return preg_replace('|/[^/]*$|', $path, static::getPageURL(FALSE)); } }