|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-01-23 13:45 UTC] dave dot marshall at atstsolutions dot co dot uk
Description: ------------ Nothing special done when compiling, just --configure and then make. If the webserver couldn't do any path translation, $_SERVER['SCRIPT_FILENAME'] is not populated. If this is desired behaviour, perhaps the documentation should be updated, as existing software will rely on it. ---- Given the code below in router.php, and starting the web server with a router > ~/Downloads/php5.4-201201231230/sapi/cli/php -S localhost:8000 router.php Fetch the root url, NULL returned > curl localhost:8000 NULL Given that this variable is documented, I'd expect it to be string(29) "/home/davem/temp_ws/router.php" Touching a file called index.php, seems to trick the webserver in to thinking it's done a path translation for the root url > touch index.php > curl localhost:8000 string(29) "/home/davem/temp_ws/index.php" Test script: --------------- router.php <?php var_dump($_SERVER['SCRIPT_FILENAME']); return true; Expected result: ---------------- string(29) "/home/davem/temp_ws/router.php" Actual result: -------------- NULL Patchesadd_router_script_file_name_svr_var (last revision 2012-03-09 02:19 UTC by sam dot e dot giles at googlemail dot com)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 12:00:02 2025 UTC |
Sorry for the multiple comments.. I see what laruence was saying now about the script that has been routed to. After playing around some more, I see what is meant by this. If the router returns false, then the resource is served as is, and, if it is a PHP script, the $_SERVER['SCRIPT_FILENAME'] is set to the resource when the dispatched script is executed. However, if we set the server variable as the router, SCRIPT_FILENAME variable will always point to the router. So if you were to have the following code in your router: <?php var_dump($_SERVER['SCRIPT_FILENAME']); if (preg_match('/\.(?:php)$/', $_SERVER["REQUEST_URI"])) return false; // serve the requested resource as-is. else { include ("test.php"); } And in test.php you had: <?php var_dump($_SERVER['SCRIPT_FILENAME']); If you request /test.php the output is: string(43) "/home/sam/php-svn/php-src/sapi/cli/test.php" string(43) "/home/sam/php-svn/php-src/sapi/cli/test.php" Where as if you request / the output is: string(45) "/home/sam/php-svn/php-src/sapi/cli/router.php" string(45) "/home/sam/php-svn/php-src/sapi/cli/router.php" Even though we've been routed to what is essentially test.php, it is not named as our SCRIPT_FILENAME, which is what is desired. It should be noted that, index code should not be placed in the router.php file in the documentation, instead, have it served directly using `return false` OR include it after a routing rule of some sort. It should also be well noted the real purpose of the router script, being that it shouldn't hold your application rules only routing rules, perhaps making it distinguishable through a different file extension in the docs?