PHP built in server and .htaccess mod rewrites

前端 未结 2 1341
面向向阳花
面向向阳花 2020-11-30 01:24

Does PHP\'s built in server not make use of .htaccess? Makes sense, I suppose, as it isn\'t relying upon Apache(?). Anyway, is it possible to tell the server to make use of

相关标签:
2条回答
  • 2020-11-30 01:35

    Here's the router that I use for the builtin php webserver that serves assets from the filesystem if they exist and otherwise performs a rewrite to an index.php file.

    Run using:

    php -S localhost:8080 router.php
    

    router.php:

    <?php
    
    chdir(__DIR__);
    $filePath = realpath(ltrim($_SERVER["REQUEST_URI"], '/'));
    if ($filePath && is_dir($filePath)){
        // attempt to find an index file
        foreach (['index.php', 'index.html'] as $indexFile){
            if ($filePath = realpath($filePath . DIRECTORY_SEPARATOR . $indexFile)){
                break;
            }
        }
    }
    if ($filePath && is_file($filePath)) {
        // 1. check that file is not outside of this directory for security
        // 2. check for circular reference to router.php
        // 3. don't serve dotfiles
        if (strpos($filePath, __DIR__ . DIRECTORY_SEPARATOR) === 0 &&
            $filePath != __DIR__ . DIRECTORY_SEPARATOR . 'router.php' &&
            substr(basename($filePath), 0, 1) != '.'
        ) {
            if (strtolower(substr($filePath, -4)) == '.php') {
                // php file; serve through interpreter
                include $filePath;
            } else {
                // asset file; serve from filesystem
                return false;
            }
        } else {
            // disallowed file
            header("HTTP/1.1 404 Not Found");
            echo "404 Not Found";
        }
    } else {
        // rewrite to our index file
        include __DIR__ . DIRECTORY_SEPARATOR . 'index.php';
    }
    
    0 讨论(0)
  • 2020-11-30 01:58

    It is not possible to handle .htaccess using PHP's built-in webserver (it is not relying on apache, it is implemented entirely in PHP's core). However, you can use router script (described here: http://php.net/manual/en/features.commandline.webserver.php).

    E.g. php -S localhost -S localhost:8080 router.php

    0 讨论(0)
提交回复
热议问题