| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | <?php/** * @file * Router script for the built-in PHP web server. * * The built-in web server should only be used for development and testing as it * has a number of limitations that makes running Drupal on it highly insecure * and somewhat limited. * * Note that: * - The server is single-threaded, any requests made during the execution of *   the main request will hang until the main request has been completed. * - The web server does not enforce any of the settings in .htaccess in *   particular a remote user will be able to download files that normally would *   be protected from direct access such as .module files. * * The router script is needed to work around a bug in PHP, see * https://bugs.php.net/bug.php?id=61286. * * Usage: * php -S localhost:8888 .ht.router.php * * @see http://php.net/manual/en/features.commandline.webserver.php */if (PHP_SAPI !== 'cli-server') {  // Bail out if this is not PHP's Development Server.  header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');  exit;}$url = parse_url($_SERVER['REQUEST_URI']);if (file_exists(__DIR__ . $url['path'])) {  // Serve the requested resource as-is.  return FALSE;}// Work around the PHP bug.$path = $url['path'];$script = 'index.php';if (str_contains($path, '.php')) {  // Work backwards through the path to check if a script exists. Otherwise  // fallback to index.php.  do {    $path = dirname($path);    if (preg_match('/\.php$/', $path) && is_file(__DIR__ . $path)) {      // Discovered that the path contains an existing PHP file. Use that as the      // script to include.      $script = ltrim($path, '/');      break;    }  } while ($path !== '/' && $path !== '.');}// Update $_SERVER variables to point to the correct index-file.$index_file_absolute = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $script;$index_file_relative = DIRECTORY_SEPARATOR . $script;// SCRIPT_FILENAME will point to the router script itself, it should point to// the full path of index.php.$_SERVER['SCRIPT_FILENAME'] = $index_file_absolute;// SCRIPT_NAME and PHP_SELF will either point to index.php or contain the full// virtual path being requested depending on the URL being requested. They// should always point to index.php relative to document root.$_SERVER['SCRIPT_NAME'] = $index_file_relative;$_SERVER['PHP_SELF'] = $index_file_relative;// Require the script and let core take over.require $_SERVER['SCRIPT_FILENAME'];
 |