PHP内置服务器和.htaccess mod重写

时间:2014-12-09 14:37:14

标签: php .htaccess php-5.4

PHP内置服务器不能使用.htaccess吗?我认为它有意义,因为它不依赖于Apache(?)。无论如何,有可能告诉服务器使用这些文件,它能处理URL重写吗?我在框架中有一些依赖于这些文件的项目。

APPLICATION_ENV=development php -S localhost:8000 -t public/

3 个答案:

答案 0 :(得分:19)

这是我用于内置php网络服务器的路由器,如果文件系统存在,则为文件系统提供资源,否则会对index.php文件执行重写。

使用:

运行
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';
}

答案 1 :(得分:10)

使用PHP内置的webserver无法处理.htaccess(它不依赖于apache,它是在PHP的核心中实现的)。但是,您可以使用路由器脚本(在此处描述:http://php.net/manual/en/features.commandline.webserver.php)。

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

答案 2 :(得分:1)

我们目前正在处理遗留项目,但我遇到了同样的问题。根据@Caleb 的回答,我们设法添加了更多控件:

  1. 将请求路由到旧的 htaccess 路由器(以下示例中的 url.php);
  2. 处理查询字符串;
  3. 更改当前目录以使用 PHP 包含;
  4. 另外:命名为 server.php 以匹配 Laravel 的 PHP 内置路由器。

只需输入 cmd:php -S localhost:8888 server.php

chdir(__DIR__);
$queryString = $_SERVER['QUERY_STRING'];
$filePath = realpath(ltrim(($queryString ? $_SERVER["SCRIPT_NAME"] : $_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 (behind) of this directory for security
    // 2. check for circular reference to server.php
    // 3. don't serve dotfiles
    if (strpos($filePath, __DIR__ . DIRECTORY_SEPARATOR) === 0
        && $filePath != __DIR__ . DIRECTORY_SEPARATOR . 'server.php' 
        && substr(basename($filePath), 0, 1) != '.'
    ) {
        if (strtolower(substr($filePath, -4)) == '.php') {
            // change directory for php includes
            chdir(dirname($filePath));

            // 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 router file
    // this portion should be customized to your needs
    $_REQUEST['valor'] = ltrim($_SERVER['REQUEST_URI'], '/');
    include __DIR__ . DIRECTORY_SEPARATOR . 'url.php';
}