Browse Source

add multiple domains reverse proxy support

Add support for a reverse proxy that handles multiple domains via different
web roots (http[s]://proxy.tld/domain.tld/owncloud).

As the reverse proxy web root is transparent for the web server the
REQUEST_URI and SCRIPT_NAME need manual adjustments. This patch replace
the direct use of this _SERVER variables with function calls and extend
this functions to overwrite the web root. Additionally it adds a Sabre
request backend that extends the Sabre_HTTP_Request to use the same
functions.
tags/v5.0.0alpha1
Stefan Herbrechtsmeier 11 years ago
parent
commit
ab2b79cda6

+ 2
- 0
apps/files/appinfo/remote.php View File

// Backends // Backends
$authBackend = new OC_Connector_Sabre_Auth(); $authBackend = new OC_Connector_Sabre_Auth();
$lockBackend = new OC_Connector_Sabre_Locks(); $lockBackend = new OC_Connector_Sabre_Locks();
$requestBackend = new OC_Connector_Sabre_Request();


// Create ownCloud Dir // Create ownCloud Dir
$publicDir = new OC_Connector_Sabre_Directory(''); $publicDir = new OC_Connector_Sabre_Directory('');


// Fire up server // Fire up server
$server = new Sabre_DAV_Server($publicDir); $server = new Sabre_DAV_Server($publicDir);
$server->httpRequest = $requestBackend;
$server->setBaseUri($baseuri); $server->setBaseUri($baseuri);


// Load plugins // Load plugins

+ 1
- 1
apps/files/index.php View File

$dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : ''; $dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : '';
// Redirect if directory does not exist // Redirect if directory does not exist
if (!\OC\Files\Filesystem::is_dir($dir . '/')) { if (!\OC\Files\Filesystem::is_dir($dir . '/')) {
header('Location: ' . $_SERVER['SCRIPT_NAME'] . '');
header('Location: ' . OCP\Util::getScriptName() . '');
exit(); exit();
} }



+ 3
- 0
config/config.sample.php View File

/* The automatic protocol detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the protocol detection. For example "https" */ /* The automatic protocol detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the protocol detection. For example "https" */
"overwriteprotocol" => "", "overwriteprotocol" => "",


/* The automatic webroot detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the automatic detection. For example "/domain.tld/ownCloud" */
"overwritewebroot" => "",

/* A proxy to use to connect to the internet. For example "myproxy.org:88" */ /* A proxy to use to connect to the internet. For example "myproxy.org:88" */
"proxy" => "", "proxy" => "",



+ 1
- 1
lib/app.php View File

* @return string * @return string
*/ */
public static function getCurrentApp() { public static function getCurrentApp() {
$script=substr($_SERVER["SCRIPT_NAME"], strlen(OC::$WEBROOT)+1);
$script=substr(OC_Request::scriptName(), strlen(OC::$WEBROOT)+1);
$topFolder=substr($script, 0, strpos($script, '/')); $topFolder=substr($script, 0, strpos($script, '/'));
if (empty($topFolder)) { if (empty($topFolder)) {
$path_info = OC_Request::getPathInfo(); $path_info = OC_Request::getPathInfo();

+ 3
- 3
lib/base.php View File

// calculate the root directories // calculate the root directories
OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4)); OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT))); OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT)));
$scriptName = $_SERVER["SCRIPT_NAME"];
$scriptName = OC_Request::scriptName();
if (substr($scriptName, -1) == '/') { if (substr($scriptName, -1) == '/') {
$scriptName .= 'index.php'; $scriptName .= 'index.php';
//make sure suburi follows the same rules as scriptName //make sure suburi follows the same rules as scriptName
header('Strict-Transport-Security: max-age=31536000'); header('Strict-Transport-Security: max-age=31536000');
ini_set("session.cookie_secure", "on"); ini_set("session.cookie_secure", "on");
if (OC_Request::serverProtocol() <> 'https' and !OC::$CLI) { if (OC_Request::serverProtocol() <> 'https' and !OC::$CLI) {
$url = "https://" . OC_Request::serverHost() . $_SERVER['REQUEST_URI'];
$url = "https://" . OC_Request::serverHost() . OC_Request::requestUri();
header("Location: $url"); header("Location: $url");
exit(); exit();
} }
if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) { if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) {
//OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG); //OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG);
OC_User::unsetMagicInCookie(); OC_User::unsetMagicInCookie();
$_REQUEST['redirect_url'] = (isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '');
$_REQUEST['redirect_url'] = OC_Request::requestUri();
OC_Util::redirectToDefaultPage(); OC_Util::redirectToDefaultPage();
} }
return true; return true;

+ 50
- 0
lib/connector/sabre/request.php View File

<?php

/**
* ownCloud
*
* @author Stefan Herbrechtsmeier
* @copyright 2012 Stefan Herbrechtsmeier <stefan@herbrechtsmeier.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/

class OC_Connector_Sabre_Request extends Sabre_HTTP_Request {
/**
* Returns the requested uri
*
* @return string
*/
public function getUri() {
return OC_Request::requestUri();
}

/**
* Returns a specific item from the _SERVER array.
*
* Do not rely on this feature, it is for internal use only.
*
* @param string $field
* @return string
*/
public function getRawServerValue($field) {
if($field == 'REQUEST_URI'){
return $this->getUri();
}
else{
return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null;
}
}
}

+ 22
- 0
lib/public/util.php View File

return(\OC_Request::serverProtocol()); return(\OC_Request::serverProtocol());
} }


/**
* @brief Returns the request uri
* @returns the request uri
*
* Returns the request uri, even if the website uses one or more
* reverse proxies
*/
public static function getRequestUri() {
return(\OC_Request::requestUri());
}

/**
* @brief Returns the script name
* @returns the script name
*
* Returns the script name, even if the website uses one or more
* reverse proxies
*/
public static function getScriptName() {
return(\OC_Request::scriptName());
}

/** /**
* @brief Creates path to an image * @brief Creates path to an image
* @param string $app app * @param string $app app

+ 32
- 0
lib/request.php View File

return $proto; return $proto;
} }


/**
* @brief Returns the request uri
* @returns the request uri
*
* Returns the request uri, even if the website uses one or more
* reverse proxies
*/
public static function requestUri() {
$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
if (OC_Config::getValue('overwritewebroot', '') <> '') {
$uri = self::scriptName() . substr($uri, strlen($_SERVER['SCRIPT_NAME']));
}
return $uri;
}

/**
* @brief Returns the script name
* @returns the script name
*
* Returns the script name, even if the website uses one or more
* reverse proxies
*/
public static function scriptName() {
$name = $_SERVER['SCRIPT_NAME'];
if (OC_Config::getValue('overwritewebroot', '') <> '') {
$serverroot = str_replace("\\", '/', substr(__DIR__, 0, -4));
$suburi = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen($serverroot)));
$name = OC_Config::getValue('overwritewebroot', '') . $suburi;
}
return $name;
}

/** /**
* @brief get Path info from request * @brief get Path info from request
* @returns string Path info or false when not found * @returns string Path info or false when not found

+ 1
- 1
lib/util.php View File

public static function checkLoggedIn() { public static function checkLoggedIn() {
// Check if we are a user // Check if we are a user
if( !OC_User::isLoggedIn()) { if( !OC_User::isLoggedIn()) {
header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', array('redirect_url' => $_SERVER["REQUEST_URI"])));
header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', array('redirect_url' => OC_Request::requestUri())));
exit(); exit();
} }
} }

+ 1
- 1
ocs/providers.php View File



require_once '../lib/base.php'; require_once '../lib/base.php';


$url=OCP\Util::getServerProtocol().'://'.substr(OCP\Util::getServerHost().$_SERVER['REQUEST_URI'], 0, -17).'ocs/v1.php/';
$url=OCP\Util::getServerProtocol().'://'.substr(OCP\Util::getServerHost().OCP\Util::getRequestUri(), 0, -17).'ocs/v1.php/';


echo(' echo('
<providers> <providers>

Loading…
Cancel
Save