3
\$\begingroup\$

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?

\$\endgroup\$
  • \$\begingroup\$ Can you provide an example of how this works? \$\endgroup\$ – pppp Sep 6 '16 at 8:54
2
\$\begingroup\$

Your code will work for one level deep working directories such as:

  1. servername/admin/index.php
  2. 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.

\$\endgroup\$
  • \$\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 Sep 14 '17 at 19:12
  • \$\begingroup\$ Yes, $_SERVER is not available in CLI because no web server is present. \$\endgroup\$ – Edcel Celiz Sep 16 '17 at 1:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.