The thing is you can start from the DOCUMENT_ROOT and work your way from there, but if you are using Apache’s VirtualDocumentRoot, it is not reliable. Hence, you need to guess it.
The trick resides in SCRIPT_NAME and SCRIPT_FILENAME that respectively describe the executed PHP file, starting from the domain, and its full path. I used exclamation marks as delimiters as I doubt you have some in your folder names. If you do, then… shame on you.
While I was at it, I added some port and https detection and the absolute URL.
- Port detection of a server running behind a proxy. You may want to use the port of the proxy, not the Web server.
- Same goes for https.
- Non-resolved symlinks and relative paths. You may want to throw a couple of realpath() in there.