diff --git a/App.php b/App.php index c14ee41..2c441df 100644 --- a/App.php +++ b/App.php @@ -76,19 +76,11 @@ class App self::THEMES_PATH // themes dir ); $this->pico->loadPlugin(new SeacmsAppPlugin($this->pico)); + $this->update_SERVERIfNeeded($this->pico, $contentFolderFromRoot); } public function runPico(): string { - if (!empty($GLOBALS['PicoVendorsDirectoryRelativeLevels']) && - intval($GLOBALS['PicoVendorsDirectoryRelativeLevels']) > 0){ - $previous = implode('',array_fill(0,intval($GLOBALS['PicoVendorsDirectoryRelativeLevels']),'../')); - $this->pico->setConfig([ - 'themes_url' => $previous.self::THEMES_PATH, - 'plugins_url' => $previous.self::PLUGINS_PATH - ]); - - } return $this->pico->run(); } @@ -134,4 +126,74 @@ class App } } } + + /** + * detect if rewrite mode then update $_SERVER in consequence + * @see Pico:evaluateRequestUrl() + * + * @param Pico $pico + * @param string $configDir + */ + protected function update_SERVERIfNeeded(Pico $pico, string $configDir) + { + $requestUrl = null; + $config = [ + 'rewrite_url' => false, + 'themes_url' => self::THEMES_PATH, + 'plugins_url' => self::PLUGINS_PATH, + ]; + $nbLevels = 0; + + // use QUERY_STRING; e.g. /pico/?sub/page + $pathComponent = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; + if ($pathComponent) { + $pathComponent = strstr($pathComponent, '&', true) ?: $pathComponent; + if (strpos($pathComponent, '=') === false) { + $requestUrl = trim(rawurldecode($pathComponent), '/'); + } + } + + if (isset($_SERVER)){ + if (!empty($requestUrl)){ + $supposedEndUrlForRewrite = $configDir.$requestUrl.'/index.php'; + $supposedEndUrlForNotRewrite = $configDir.'index.php'; + if (!empty($_SERVER['SCRIPT_NAME']) && substr($_SERVER['SCRIPT_NAME'],-strlen($supposedEndUrlForRewrite)) == $supposedEndUrlForRewrite){ + $_SERVER['SCRIPT_NAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_NAME']); + if (!empty($_SERVER['SCRIPT_FILENAME'])){ + $_SERVER['SCRIPT_FILENAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_FILENAME']); + } + if (!empty($_SERVER['REQUEST_URI'])){ + $_SERVER['REQUEST_URI'] = str_replace([$configDir.$requestUrl.'/',$configDir.$requestUrl],$configDir,$_SERVER['REQUEST_URI']); + } + $config['rewrite_url'] = true; + $nbLevels = count(explode('/',$configDir.$requestUrl)); + } elseif (!empty($_SERVER['SCRIPT_NAME']) && substr($_SERVER['SCRIPT_NAME'],-strlen($supposedEndUrlForNotRewrite)) == $supposedEndUrlForNotRewrite) { + $nbLevels = count(explode('/',$configDir)) -1; + } + } elseif (!empty($_SERVER['SCRIPT_NAME']) && is_string($_SERVER['SCRIPT_NAME'])) { + $matches = []; + $configDirForMatch = preg_quote($configDir,'/'); + if (preg_match("/^(.*)$configDirForMatch(.*)index.php$/",$_SERVER['SCRIPT_NAME'],$matches)){ + $rootPath = $matches[1]; + $requestUrl = !empty($matches[2]) ? (substr($matches[2],-1) == '/' ? substr($matches[2],0,-1) : $matches[2]) : ''; + + if (!empty($requestUrl)){ + $supposedEndUrlForRewrite = $configDir.$requestUrl.'/index.php'; + if (!empty($_SERVER['SCRIPT_FILENAME'])){ + $_SERVER['SCRIPT_FILENAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_FILENAME']); + } + if (!empty($_SERVER['SCRIPT_NAME'])){ + $_SERVER['SCRIPT_NAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_NAME']); + } + } + $nbLevels = count(explode('/',$configDir)) -1; + $config['rewrite_url'] = true; + } + } + } + $previous = implode('',array_fill(0,$nbLevels,'../')); + $config['themes_url'] = $previous.$config['themes_url']; + $config['plugins_url'] = $previous.$config['plugins_url']; + $pico->setConfig($config); + } } \ No newline at end of file