diff --git a/lib/private/request.php b/lib/private/request.php
index d11e5b16cfe00a77c8919ca62405794128d058e9..7a75bf252080433663ef015351249546144cc0b0 100755
--- a/lib/private/request.php
+++ b/lib/private/request.php
@@ -136,7 +136,18 @@ class OC_Request {
 	 * @returns string Path info or false when not found
 	 */
 	public static function getRawPathInfo() {
-		$path_info = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));
+		$requestUri = $_SERVER['REQUEST_URI'];
+		// remove too many leading slashes - can be caused by reverse proxy configuration
+		if (strpos($requestUri, '/') === 0) {
+			$requestUri = '/' . ltrim($requestUri, '/');
+		}
+
+		$scriptName = $_SERVER['SCRIPT_NAME'];
+		// in case uri and script name don't match we better throw an exception
+		if (strpos($requestUri, $scriptName) !== 0) {
+			throw new Exception("REQUEST_URI($requestUri) does not start with the SCRIPT_NAME($scriptName)");
+		}
+		$path_info = substr($requestUri, strlen($scriptName));
 		// Remove the query string from REQUEST_URI
 		if ($pos = strpos($path_info, '?')) {
 			$path_info = substr($path_info, 0, $pos);
diff --git a/tests/lib/request.php b/tests/lib/request.php
index 2b2094a612dd36abc7d781325a059df468d364e6..a740751f060df22f4191a13d4b735eea0e496319 100644
--- a/tests/lib/request.php
+++ b/tests/lib/request.php
@@ -23,4 +23,46 @@ class Test_Request extends PHPUnit_Framework_TestCase {
 		$scriptName = OC_Request::scriptName();
 		$this->assertEquals('/domain.tld/ownCloud/tests/lib/request.php', $scriptName);
 	}
+
+	/**
+	 * @dataProvider rawPathInfoProvider
+	 * @param $expected
+	 * @param $requestUri
+	 * @param $scriptName
+	 */
+	public function testRawPathInfo($expected, $requestUri, $scriptName) {
+		$_SERVER['REQUEST_URI'] = $requestUri;
+		$_SERVER['SCRIPT_NAME'] = $scriptName;
+		$rawPathInfo = OC_Request::getRawPathInfo();
+		$this->assertEquals($expected, $rawPathInfo);
+	}
+
+	function rawPathInfoProvider() {
+		return array(
+			array('/core/ajax/translations.php', 'index.php/core/ajax/translations.php', 'index.php'),
+			array('/core/ajax/translations.php', '/index.php/core/ajax/translations.php', '/index.php'),
+			array('/core/ajax/translations.php', '//index.php/core/ajax/translations.php', '/index.php'),
+		);
+	}
+
+	/**
+	 * @dataProvider rawPathInfoThrowsExceptionProvider
+	 * @expectedException Exception
+	 *
+	 * @param $requestUri
+	 * @param $scriptName
+	 */
+	public function testRawPathInfoThrowsException($requestUri, $scriptName) {
+		$_SERVER['REQUEST_URI'] = $requestUri;
+		$_SERVER['SCRIPT_NAME'] = $scriptName;
+		OC_Request::getRawPathInfo();
+	}
+
+	function rawPathInfoThrowsExceptionProvider() {
+		return array(
+			array('core/ajax/translations.php', '/index.php'),
+			array('/core/ajax/translations.php', '/index.php'),
+			array('//core/ajax/translations.php', '/index.php'),
+		);
+	}
 }