- <?php
- /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @link http://github.com/zendframework/zf2 for the canonical source repository
- * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
-
- namespace Zend\View\Helper;
-
- /**
- * Helper for returning the current server URL (optionally with request URI)
- */
- class ServerUrl extends AbstractHelper
- {
- /**
- * Host (including port)
- *
- * @var string
- */
- protected $host;
-
- /**
- * Port
- *
- * @var int
- */
- protected $port;
-
- /**
- * Scheme
- *
- * @var string
- */
- protected $scheme;
-
- /**
- * Whether or not to query proxy servers for address
- *
- * @var bool
- */
- protected $useProxy = false;
-
- /**
- * View helper entry point:
- * Returns the current host's URL like http://site.com
- *
- * @param string|bool $requestUri [optional] if true, the request URI
- * found in $_SERVER will be appended
- * as a path. If a string is given, it
- * will be appended as a path. Default
- * is to not append any path.
- * @return string
- */
- public function __invoke($requestUri = null)
- {
- if ($requestUri === true) {
- $path = $_SERVER['REQUEST_URI'];
- } elseif (is_string($requestUri)) {
- $path = $requestUri;
- } else {
- $path = '';
- }
-
- return $this->getScheme() . '://' . $this->getHost() . $path;
- }
-
- /**
- * Detect the host based on headers
- *
- * @return void
- */
- protected function detectHost()
- {
- if ($this->setHostFromProxy()) {
- return;
- }
-
- if (isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST'])) {
- // Detect if the port is set in SERVER_PORT and included in HTTP_HOST
- if (isset($_SERVER['SERVER_PORT'])) {
- $portStr = ':' . $_SERVER['SERVER_PORT'];
- if (substr($_SERVER['HTTP_HOST'], 0-strlen($portStr), strlen($portStr)) == $portStr) {
- $this->setHost(substr($_SERVER['HTTP_HOST'], 0, 0-strlen($portStr)));
- return;
- }
- }
-
- $this->setHost($_SERVER['HTTP_HOST']);
-
- return;
- }
-
- if (!isset($_SERVER['SERVER_NAME']) || !isset($_SERVER['SERVER_PORT'])) {
- return;
- }
-
- $name = $_SERVER['SERVER_NAME'];
- $this->setHost($name);
- }
-
- /**
- * Detect the port
- *
- * @return null
- */
- protected function detectPort()
- {
- if ($this->setPortFromProxy()) {
- return;
- }
-
- if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT']) {
- $this->setPort($_SERVER['SERVER_PORT']);
- return;
- }
- }
-
- /**
- * Detect the scheme
- *
- * @return null
- */
- protected function detectScheme()
- {
- if ($this->setSchemeFromProxy()) {
- return;
- }
-
- switch (true) {
- case (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] === true)):
- case (isset($_SERVER['HTTP_SCHEME']) && ($_SERVER['HTTP_SCHEME'] == 'https')):
- case (443 === $this->getPort()):
- $scheme = 'https';
- break;
- default:
- $scheme = 'http';
- break;
- }
-
- $this->setScheme($scheme);
- }
-
- /**
- * Detect if a proxy is in use, and, if so, set the host based on it
- *
- * @return bool
- */
- protected function setHostFromProxy()
- {
- if (!$this->useProxy) {
- return false;
- }
-
- if (!isset($_SERVER['HTTP_X_FORWARDED_HOST']) || empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
- return false;
- }
-
- $host = $_SERVER['HTTP_X_FORWARDED_HOST'];
- if (strpos($host, ',') !== false) {
- $hosts = explode(',', $host);
- $host = trim(array_pop($hosts));
- }
- if (empty($host)) {
- return false;
- }
- $this->setHost($host);
-
- return true;
- }
-
- /**
- * Set port based on detected proxy headers
- *
- * @return bool
- */
- protected function setPortFromProxy()
- {
- if (!$this->useProxy) {
- return false;
- }
-
- if (!isset($_SERVER['HTTP_X_FORWARDED_PORT']) || empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
- return false;
- }
-
- $port = $_SERVER['HTTP_X_FORWARDED_PORT'];
- $this->setPort($port);
-
- return true;
- }
-
- /**
- * Set the current scheme based on detected proxy headers
- *
- * @return bool
- */
- protected function setSchemeFromProxy()
- {
- if (!$this->useProxy) {
- return false;
- }
-
- if (isset($_SERVER['SSL_HTTPS'])) {
- $sslHttps = strtolower($_SERVER['SSL_HTTPS']);
- if (in_array($sslHttps, array('on', 1))) {
- $this->setScheme('https');
- return true;
- }
- }
-
- if (!isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
- return false;
- }
-
- $scheme = trim(strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']));
- if (empty($scheme)) {
- return false;
- }
-
- $this->setScheme($scheme);
-
- return true;
- }
-
- /**
- * Sets host
- *
- * @param string $host
- * @return ServerUrl
- */
- public function setHost($host)
- {
- $port = $this->getPort();
- $scheme = $this->getScheme();
-
- if (($scheme == 'http' && (null === $port || $port == 80))
- || ($scheme == 'https' && (null === $port || $port == 443))
- ) {
- $this->host = $host;
- return $this;
- }
-
- $this->host = $host . ':' . $port;
-
- return $this;
- }
-
- /**
- * Returns host
- *
- * @return string
- */
- public function getHost()
- {
- if (null === $this->host) {
- $this->detectHost();
- }
-
- return $this->host;
- }
-
- /**
- * Set server port
- *
- * @param int $port
- * @return ServerUrl
- */
- public function setPort($port)
- {
- $this->port = (int) $port;
-
- return $this;
- }
-
- /**
- * Retrieve the server port
- *
- * @return int|null
- */
- public function getPort()
- {
- if (null === $this->port) {
- $this->detectPort();
- }
-
- return $this->port;
- }
-
- /**
- * Sets scheme (typically http or https)
- *
- * @param string $scheme
- * @return ServerUrl
- */
- public function setScheme($scheme)
- {
- $this->scheme = $scheme;
-
- return $this;
- }
-
- /**
- * Returns scheme (typically http or https)
- *
- * @return string
- */
- public function getScheme()
- {
- if (null === $this->scheme) {
- $this->detectScheme();
- }
-
- return $this->scheme;
- }
-
- /**
- * Set flag indicating whether or not to query proxy servers
- *
- * @param bool $useProxy
- * @return ServerUrl
- */
- public function setUseProxy($useProxy = false)
- {
- $this->useProxy = (bool) $useProxy;
-
- return $this;
- }
- }
# |
Change |
User |
Description |
Committed |
|
#1
|
18334 |
Liz Lam |
initial add of jambox |
9 years ago
|
|