|
|
@ -141,64 +141,244 @@ class App |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
protected function update_SERVERIfNeeded(Pico $pico, string $configDir) |
|
|
|
protected function update_SERVERIfNeeded(Pico $pico, string $configDir) |
|
|
|
{ |
|
|
|
{ |
|
|
|
$requestUrl = null; |
|
|
|
$data = [ |
|
|
|
$config = [ |
|
|
|
'FROM_QUERY_STRING' => '', |
|
|
|
'rewrite_url' => false, |
|
|
|
'FROM_SCRIPT_NAME' => '', |
|
|
|
'themes_url' => self::THEMES_PATH, |
|
|
|
'FROM_SCRIPT_FILENAME' => '', |
|
|
|
'plugins_url' => self::PLUGINS_PATH, |
|
|
|
'rootPath' => '/', |
|
|
|
|
|
|
|
'rootPathFound' => false, |
|
|
|
|
|
|
|
'rewriteModeactivated' => false, |
|
|
|
|
|
|
|
'page' => 'index', |
|
|
|
|
|
|
|
'continue' => true |
|
|
|
]; |
|
|
|
]; |
|
|
|
$nbLevels = 0; |
|
|
|
$this |
|
|
|
|
|
|
|
->extractRequestUrlFormQueryString($data) |
|
|
|
|
|
|
|
->extractRequestUrlFromScriptFileName($data,$configDir) |
|
|
|
|
|
|
|
->extractRequestUrlFromScriptName($data,$configDir) |
|
|
|
|
|
|
|
->extractRootPathFromScriptNameIfNeeded($data,$configDir) |
|
|
|
|
|
|
|
->definePage($data) |
|
|
|
|
|
|
|
->setUrl($data, $configDir, $pico); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// use QUERY_STRING; e.g. /pico/?sub/page |
|
|
|
/** |
|
|
|
$pathComponent = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; |
|
|
|
* extract requestUrlFromQueryString |
|
|
|
if ($pathComponent) { |
|
|
|
* @param array &$data |
|
|
|
$pathComponent = strstr($pathComponent, '&', true) ?: $pathComponent; |
|
|
|
* @return self |
|
|
|
if (strpos($pathComponent, '=') === false) { |
|
|
|
*/ |
|
|
|
$requestUrl = trim(rawurldecode($pathComponent), '/'); |
|
|
|
protected function extractRequestUrlFormQueryString(array &$data): self |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($data['continue']){ |
|
|
|
|
|
|
|
// use QUERY_STRING; e.g. ?sub/page |
|
|
|
|
|
|
|
$qString = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; |
|
|
|
|
|
|
|
if ($qString) { |
|
|
|
|
|
|
|
$qString = strstr($qString, '&', true) ?: $qString; |
|
|
|
|
|
|
|
if (strpos($qString, '=') === false) { |
|
|
|
|
|
|
|
$data['FROM_QUERY_STRING'] = $qString; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return $this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (isset($_SERVER)){ |
|
|
|
/** |
|
|
|
if (!empty($requestUrl)){ |
|
|
|
* extract requestUrlFromScriptName |
|
|
|
$supposedEndUrlForRewrite = $configDir.$requestUrl.'/index.php'; |
|
|
|
* @param array &$data |
|
|
|
$supposedEndUrlForNotRewrite = $configDir.'index.php'; |
|
|
|
* @param string $configDir |
|
|
|
if (!empty($_SERVER['SCRIPT_NAME']) && substr($_SERVER['SCRIPT_NAME'],-strlen($supposedEndUrlForRewrite)) == $supposedEndUrlForRewrite){ |
|
|
|
* @return self |
|
|
|
$_SERVER['SCRIPT_NAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_NAME']); |
|
|
|
*/ |
|
|
|
if (!empty($_SERVER['SCRIPT_FILENAME'])){ |
|
|
|
protected function extractRequestUrlFromScriptName(array &$data, string $configDir): self |
|
|
|
$_SERVER['SCRIPT_FILENAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_FILENAME']); |
|
|
|
{ |
|
|
|
|
|
|
|
if ($data['continue'] && !empty($_SERVER['SCRIPT_NAME']) && is_string($_SERVER['SCRIPT_NAME'])){ |
|
|
|
|
|
|
|
// use SCRIPT_NAME; e.g. /subfolder/content/sub/page/index.php |
|
|
|
|
|
|
|
$matches = []; |
|
|
|
|
|
|
|
$configDirForMatch = preg_quote($configDir,'/'); |
|
|
|
|
|
|
|
if (preg_match("/^(.*)$configDirForMatch(.*)(?!.php)(?:index.php)?$/",$_SERVER['SCRIPT_NAME'],$matches)){ |
|
|
|
|
|
|
|
$data['rootPath'] = $matches[1]; |
|
|
|
|
|
|
|
$data['rootPathFound'] = true; |
|
|
|
|
|
|
|
$data['FROM_SCRIPT_NAME'] = $this->formatStringWithLeadingSlash($matches[2],false); |
|
|
|
|
|
|
|
} elseif (!empty($data['FROM_SCRIPT_FILENAME']) && ( |
|
|
|
|
|
|
|
$this->isServerEndedBy("{$data['FROM_SCRIPT_FILENAME']}/index.php",'SCRIPT_NAME') || |
|
|
|
|
|
|
|
$this->isServerEndedBy("{$data['FROM_SCRIPT_FILENAME']}/",'SCRIPT_NAME') |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
){ |
|
|
|
|
|
|
|
$data['rootPath'] = $this->formatStringWithLeadingSlash($matches[2],false); |
|
|
|
|
|
|
|
$data['rootPathFound'] = true; |
|
|
|
|
|
|
|
$data['FROM_SCRIPT_NAME'] = $data['FROM_SCRIPT_FILENAME']; |
|
|
|
|
|
|
|
$data['rewriteModeactivated'] = true; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!empty($_SERVER['REQUEST_URI'])){ |
|
|
|
|
|
|
|
$_SERVER['REQUEST_URI'] = str_replace([$configDir.$requestUrl.'/',$configDir.$requestUrl],$configDir,$_SERVER['REQUEST_URI']); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
$config['rewrite_url'] = true; |
|
|
|
return $this; |
|
|
|
$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'])) { |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* extract requestUrlFromScriptFileName |
|
|
|
|
|
|
|
* @param array &$data |
|
|
|
|
|
|
|
* @param string $configDir |
|
|
|
|
|
|
|
* @return self |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function extractRequestUrlFromScriptFileName(array &$data, string $configDir): self |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($data['continue'] && |
|
|
|
|
|
|
|
!empty($_SERVER['SCRIPT_FILENAME']) && |
|
|
|
|
|
|
|
is_string($_SERVER['SCRIPT_FILENAME']) && |
|
|
|
|
|
|
|
substr($_SERVER['SCRIPT_FILENAME'],-strlen('index.php')) == 'index.php'){ |
|
|
|
|
|
|
|
// use SCRIPT_FILENAME; e.g. /var/www/subfolder/content/sub/page/index.php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// check if the current folder seems to correspond to root folder of seacms |
|
|
|
|
|
|
|
if (is_dir('content') && is_dir('sites') && is_file('index.php')){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$cwd = realpath(getcwd()); |
|
|
|
|
|
|
|
$truncatedFileName = substr(realpath($_SERVER['SCRIPT_FILENAME']),strlen($cwd)); |
|
|
|
$matches = []; |
|
|
|
$matches = []; |
|
|
|
$configDirForMatch = preg_quote($configDir,'/'); |
|
|
|
$configDirForMatch1 = preg_quote($configDir,'/'); |
|
|
|
if (preg_match("/^(.*)$configDirForMatch(.*)index.php$/",$_SERVER['SCRIPT_NAME'],$matches)){ |
|
|
|
$configDirForMatch2 = preg_quote(str_replace('/','\\',$configDir),'/'); |
|
|
|
$rootPath = $matches[1]; |
|
|
|
if (preg_match("/^(.*)(?:$configDirForMatch1|$configDirForMatch2)(.*)index.php$/",$_SERVER['SCRIPT_FILENAME'],$matches)){ |
|
|
|
$requestUrl = !empty($matches[2]) ? (substr($matches[2],-1) == '/' ? substr($matches[2],0,-1) : $matches[2]) : ''; |
|
|
|
$formFileName = str_replace('\\','/',$matches[2]); |
|
|
|
|
|
|
|
$data['FROM_SCRIPT_FILENAME'] = $this->formatStringWithLeadingSlash($formFileName,false); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return $this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!empty($requestUrl)){ |
|
|
|
/** |
|
|
|
$supposedEndUrlForRewrite = $configDir.$requestUrl.'/index.php'; |
|
|
|
* extract rootPath from ScriptName |
|
|
|
if (!empty($_SERVER['SCRIPT_FILENAME'])){ |
|
|
|
* @param array &$data |
|
|
|
$_SERVER['SCRIPT_FILENAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_FILENAME']); |
|
|
|
* @param string $configDir |
|
|
|
|
|
|
|
* @return self |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function extractRootPathFromScriptNameIfNeeded(array &$data, string $configDir): self |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($data['continue'] && !$data['rootPathFound']){ |
|
|
|
|
|
|
|
// use SCRIPT_NAME; e.g. /subfolder/index.php |
|
|
|
|
|
|
|
$matches = []; |
|
|
|
|
|
|
|
$wantedPage = empty($data['FROM_SCRIPT_FILENAME']) ? '' : $data['FROM_SCRIPT_FILENAME']; |
|
|
|
|
|
|
|
$wantedPageQuoted = preg_quote($wantedPage,'/'); |
|
|
|
|
|
|
|
if (preg_match("/^(.*){$wantedPageQuoted}\/(?:index.php)?$/",$_SERVER['SCRIPT_NAME'],$matches)){ |
|
|
|
|
|
|
|
$data['rootPath'] = $this->formatStringWithLeadingSlash($matches[1],true); |
|
|
|
|
|
|
|
$data['rootPathFound'] = true; |
|
|
|
|
|
|
|
$data['rewriteModeactivated'] = (realpath($_SERVER['SCRIPT_FILENAME']) == realpath(getcwd()."/{$configDir}index.php")); |
|
|
|
} |
|
|
|
} |
|
|
|
if (!empty($_SERVER['SCRIPT_NAME'])){ |
|
|
|
|
|
|
|
$_SERVER['SCRIPT_NAME'] = str_replace($supposedEndUrlForRewrite,$configDir.'index.php',$_SERVER['SCRIPT_NAME']); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return $this; |
|
|
|
} |
|
|
|
} |
|
|
|
$nbLevels = count(explode('/',$configDir)) -1; |
|
|
|
|
|
|
|
$config['rewrite_url'] = true; |
|
|
|
/** |
|
|
|
|
|
|
|
* format string with leading '/' |
|
|
|
|
|
|
|
* @param null|string $rawString |
|
|
|
|
|
|
|
* @param bool $withLeadingSlash |
|
|
|
|
|
|
|
* @return string $page |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function formatStringWithLeadingSlash(?string $rawString, bool $withLeadingSlash = false): string |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return $withLeadingSlash |
|
|
|
|
|
|
|
? (!empty($rawString) ? (substr($rawString,-1) == '/' ? $rawString : $rawString.'/') : '/') |
|
|
|
|
|
|
|
: (!empty($rawString) ? (substr($rawString,-1) == '/' ? substr($rawString,0,-1) : $rawString) : ''); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* define page |
|
|
|
|
|
|
|
* @param array $data |
|
|
|
|
|
|
|
* @return $this |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function definePage(array &$data): self |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if ($data['continue']){ |
|
|
|
|
|
|
|
$data['page'] = !empty($data['FROM_QUERY_STRING']) |
|
|
|
|
|
|
|
? $data['FROM_QUERY_STRING'] |
|
|
|
|
|
|
|
: ( |
|
|
|
|
|
|
|
!empty($data['FROM_SCRIPT_NAME']) |
|
|
|
|
|
|
|
? $data['FROM_SCRIPT_NAME'] |
|
|
|
|
|
|
|
: ( |
|
|
|
|
|
|
|
!empty($data['FROM_SCRIPT_FILENAME']) |
|
|
|
|
|
|
|
? $data['FROM_SCRIPT_FILENAME'] |
|
|
|
|
|
|
|
: 'index' |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return $this; |
|
|
|
} |
|
|
|
} |
|
|
|
$previous = implode('',array_fill(0,$nbLevels,'../')); |
|
|
|
|
|
|
|
$config['themes_url'] = $previous.$config['themes_url']; |
|
|
|
/** |
|
|
|
$config['plugins_url'] = $previous.$config['plugins_url']; |
|
|
|
* set SERVER QUERY_STRING |
|
|
|
|
|
|
|
* @param array $data |
|
|
|
|
|
|
|
* @param string $configDir |
|
|
|
|
|
|
|
* @param Pico $pico |
|
|
|
|
|
|
|
* @return $this |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function setUrl(array $data, string $configDir, Pico $pico): self |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$bfserver = $_SERVER; |
|
|
|
|
|
|
|
// SCRIPT_NAME |
|
|
|
|
|
|
|
$rootPath = (empty($data['rootPath']) || !is_string($data['rootPath'])) ? '/' : $this->formatStringWithLeadingSlash($data['rootPath'],true); |
|
|
|
|
|
|
|
$_SERVER['SCRIPT_NAME'] = $rootPath.($data['rewriteModeactivated']?'':$configDir).'index.php'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'].($_SERVER['PATH_INFO'] ?? ''); |
|
|
|
|
|
|
|
$_SERVER['DOCUMENT_URI'] = $_SERVER['PHP_SELF']; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// QUERY_STRING |
|
|
|
|
|
|
|
$qString = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; |
|
|
|
|
|
|
|
if (substr($qString,0,strlen($data['page'])+1)==$data['page'].'&'){ |
|
|
|
|
|
|
|
$qString = substr($qString,strlen($data['page'])+1); |
|
|
|
|
|
|
|
} elseif ($qString == $data['page']){ |
|
|
|
|
|
|
|
$qString = ''; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!empty($data['page'])){ |
|
|
|
|
|
|
|
$qString = $data['page'].(empty($qString) ? '' : "&$qString"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$_SERVER['QUERY_STRING'] = $qString; |
|
|
|
|
|
|
|
$_SERVER['REQUEST_URI'] = $_SERVER['DOCUMENT_URI'].(empty($_SERVER['QUERY_STRING'])?'':"?{$_SERVER['QUERY_STRING']}"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//SCRIPT_FILENAME |
|
|
|
|
|
|
|
$cwd = getcwd(); |
|
|
|
|
|
|
|
$fn = str_replace('\\','/',realpath($cwd.'/'.$configDir.'index.php')); |
|
|
|
|
|
|
|
$_SERVER['SCRIPT_FILENAME'] = $fn; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// config |
|
|
|
|
|
|
|
$baseUrl = $this->getBaseUrl($rootPath,$configDir,$pico); |
|
|
|
|
|
|
|
$config = $pico->getConfig(); |
|
|
|
|
|
|
|
$config['rewrite_url'] = true; |
|
|
|
|
|
|
|
$config['configDir'] = $this->formatStringWithLeadingSlash($configDir,false); |
|
|
|
|
|
|
|
$config['content_dir'] = $this->formatStringWithLeadingSlash($configDir,false); |
|
|
|
|
|
|
|
$config['themes_url'] = "$baseUrl$rootPath".self::THEMES_PATH; |
|
|
|
|
|
|
|
$config['plugins_url'] = "$baseUrl$rootPath".self::PLUGINS_PATH; |
|
|
|
$pico->setConfig($config); |
|
|
|
$pico->setConfig($config); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$server = $_SERVER; |
|
|
|
|
|
|
|
$dataJSON = json_encode(compact(['data','configDir','qString','cwd','fn','config','server','bfserver'])); |
|
|
|
|
|
|
|
// echo <<<HTML |
|
|
|
|
|
|
|
// <script> |
|
|
|
|
|
|
|
// console.log($dataJSON) |
|
|
|
|
|
|
|
// </script> |
|
|
|
|
|
|
|
// HTML; |
|
|
|
|
|
|
|
return $this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* test if $_SERVER[$key] end by $wantedValue |
|
|
|
|
|
|
|
* @param string $wantedValue |
|
|
|
|
|
|
|
* @param string $key |
|
|
|
|
|
|
|
* @return bool |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function isServerEndedBy(string $wantedValue, string $key): bool |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return (!empty($_SERVER[$key]) && is_string($_SERVER[$key]) && substr($_SERVER[$key],-strlen($wantedValue)) == $wantedValue); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* generate Base Url |
|
|
|
|
|
|
|
* @param string $rootPath |
|
|
|
|
|
|
|
* @param string $configDir |
|
|
|
|
|
|
|
* @param Pico $pico |
|
|
|
|
|
|
|
* @return string |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected function getBaseUrl(string $rootPath,string $configDir, Pico $pico): string |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$baseUrl = $this->formatStringWithLeadingSlash($pico->getBaseUrl(),true); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (substr($baseUrl,-strlen($rootPath.$configDir)) == $rootPath.$configDir){ |
|
|
|
|
|
|
|
$baseUrl = substr($baseUrl,0,-strlen($rootPath.$configDir)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return $this->formatStringWithLeadingSlash($baseUrl,false); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |