+ public static function detectBaseUrl()
+ {
+ if (!isset($_SERVER['REQUEST_URI'])
+ || !isset($_SERVER['SCRIPT_NAME'])
+ ) {
+ return '/';
+ }
+
+ $scriptName = $_SERVER['SCRIPT_NAME'];
+ $requestUri = $_SERVER['REQUEST_URI'];
+ if (substr($scriptName, -4) != '.php') {
+ //a phar
+ return $scriptName . '/';
+ }
+
+ if (isset($_GET['id'])) {
+ $idp = strpos($requestUri, '/' . $_GET['id'] . '/');
+ if ($idp !== false) {
+ return substr($requestUri, 0, $idp) . '/';
+ }
+ }
+
+ if (substr($requestUri, -4) != '.php') {
+ $requestUri .= '.php';
+ }
+ $snl = strlen($scriptName);
+ if (substr($requestUri, -$snl) == $scriptName) {
+ return substr($requestUri, 0, -$snl) . '/';
+ }
+
+ return '/';
+ }
+
+ /**
+ * Resolves "/../" and "/./" in file paths without validating them.
+ */
+ public static function foldPath($path)
+ {
+ $path = str_replace('/./', '/', $path);
+ $path = str_replace('/./', '/', $path);
+ $path = preg_replace('#/[^/]+/\.\./#', '/', $path);
+ $path = preg_replace('#/[^/]+/\.\./#', '/', $path);
+ return $path;
+ }
+}