Вы хотите инкапсулировать то, что меняется, то есть относительный путь к некоторому местоположению запроса (просматриваемый из браузера) к корневому URL вашего сайта (снова просматриваемый из браузера).
Для этого вам прежде всего необходимо знать корневой URL и URL запроса, в PHP это может выглядеть примерно так:
$rootURL = 'http://example.com/mysite/basedir/';
$requestURI = $_SERVER['REQUEST_URI']; # e.g. /mysite/basedir/subdir/index.php
Затем PHP предлагает разнообразные строковые функции, чтобы превратить это в относительный путь:
'../' + X
Например, вы можете поместить это в класс, который делает это:
$relative = new RelativeRoot($rootURL, $requestURI);
echo $relative; # ../
echo $relative->getRelative('style/default.css'); # ../style/default.css
Примером такого класса будет:
/**
* Relative Path to Root based on root URL and request URI
*
* @author hakre
*/
class RelativeRoot
{
/**
* @var string
*/
private $relative;
/**
* @param string $rootURL
* @param string $requestURI
*/
public function __construct($rootURL, $requestURI)
{
$this->relative = $this->calculateRelative($rootURL, $requestURI);
}
/**
* @param string $link (optional) from root
* @return string
*/
public function getRelative($link = '')
{
return $this->relative . $link;
}
public function __toString()
{
return $this->relative;
}
/**
* calculate the relative URL path
*
* @param string $rootURL
* @param string $requestURI
*/
private function calculateRelative($rootURL, $requestURI)
{
$rootPath = parse_url($rootURL, PHP_URL_PATH);
$requestPath = parse_url($requestURI, PHP_URL_PATH);
if ($rootPath === substr($requestPath, 0, $rootPathLen = strlen($rootPath)))
{
$requestRelativePath = substr($requestPath, $rootPathLen);
$level = substr_count($requestRelativePath, '/');
$relative = str_repeat('../', $level);
# save the output some bytes if applicable
if (strlen($relative) > strlen($rootPath))
{
$relative = $rootPath;
}
}
else
{
$relative = $rootPath;
}
return $relative;
}
}