I have this little piece of code which determines the base URL of PHP:
$root = $_SERVER["SERVER_NAME"];
if(basename(__FILE__) !== trim($_SERVER["PHP_SELF"], "/\\")) {
$root .= "/" . basename(__DIR__);
}
This is working for me, but are there other solutions for this "problem," or are there any cases where this would fail?
-
\$\begingroup\$ Can you provide an example of how this works? \$\endgroup\$pppp– pppp2016年09月06日 08:54:28 +00:00Commented Sep 6, 2016 at 8:54
1 Answer 1
Your code will work for one level deep working directories such as:
- servername/admin/index.php
- servername/sample/test.php
However, go one level deeper and it will not work. If I have servername/one/two/index.php, I will get a servername/two. It is because the basename() returns the working folder of the file.
I find this code useful for common applications:
$request = explode('/', $_SERVER['SCRIPT_NAME']);
array_pop($request);
echo $_SERVER['SERVER_NAME'] . implode('/', $request);
It makes use of server's script name. Given the sample servername/one/two/index.php, it will return /one/two/index.php. We then remove the script from the directory using explode and popping the result, and then finally concatenating it to the server name.
-
\$\begingroup\$ Both the OP example and your example will cause a notice in a command line environment, where
$_SERVER['SERVER_NAME']
is undefined. \$\endgroup\$Conor Mancone– Conor Mancone2017年09月14日 19:12:30 +00:00Commented Sep 14, 2017 at 19:12 -
\$\begingroup\$ Yes, $_SERVER is not available in CLI because no web server is present. \$\endgroup\$Edcel Celiz– Edcel Celiz2017年09月16日 01:46:23 +00:00Commented Sep 16, 2017 at 1:46