PHP $_SERVER['...']
variables such as for 'PHP_SELF'
, 'SCRIPT_NAME'
, 'REQUEST_URI'
have me somewhat confused. I've seen (at least some) previous questions about these and can do some testing in some environments, but I've run into environments where unexpected things happen.
I write apps that must be installable in any subdirectory below the document root. For example, suppose that the document root is /var/www/html
and that the app is installed in /var/www/html/sub/dir
. I need to require()
files in /var/www/html/sub/dir
(or subdirectories to that) and link to files in www.example.com://sub/dir
. Call '/sub/dir' SUB_DIR. I also want rewrite rules for friendly urls such as www.example.com/sub/dir/route/key1/val1/key2/val2
.
I have an .htaccess
for Apache and a web.config for IIS to do my rewrites to send everything through /var/www/html/sub/dir/index.php
. I have not run into a need to figure out nginx or others.
I've been doing something like following but with more care about off by one issues and about Windows v. real world directory separators.
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$reqUrl = $_SERVER['REQUEST_URI'];
$pwd = __DIR__; /* Occuring in www.example.com/sub/dir/index.php) */
/* Expected example value for $pwd: /var/www/html/sub/dir */
$appLinkDir = substr($pwd, strlen(docRoot));
/* Expected example value for $appLinkDir: /sub/dir */
$workingRequest = substr($_SERVER['REQUEST_URI'], strlen(appLinkDir));
/* Expected example value for $workingRequest: /route/key1/val1/key2/val2 */
I ran into an environment where $pwd is /var/www/html instead of /var/www/html/sub/dir . My guess is that the app was installed in /var/www/html (not /var/www/html/sub/dir) but was they were doing global rewrites from /sub/dir/index.php (or something). At any rate, the unexpected value of $pwd gave me unexpected values for $appLinkDir and $workingRequest .
The problematic environment was from a third party code reviewer who may have assumed my app expected to be installed in /var/www/html/sub/dir
when it in fact was expecting to discover where it was installed.
Any good (or even bad) ideas on how I can get correct values for $appLinkDir
and $workingRequest
?