您的问题与您使用 PHP 内置 Web 服务器的方式直接相关。
如中所述PHP docs http://php.net/manual/en/features.commandline.webserver.php,服务器处理请求的方式如下:
URI 请求将从启动 PHP 的当前工作目录提供服务,除非使用 -t 选项指定显式文档根目录。如果 URI 请求未指定文件,则返回给定目录中的 index.php 或 index.html。如果两个文件都不存在,则将在父目录中继续查找index.php和index.html,依此类推,直到找到一个文件或到达文档根目录。如果找到index.php或index.html,则将其返回,并将$_SERVER['PATH_INFO']设置为URI的尾随部分。否则返回 404 响应代码。
如果 Web 服务器启动时在命令行上给出 PHP 文件,则它将被视为“路由器”脚本。该脚本在每个 HTTP 请求开始时运行。如果此脚本返回 FALSE,则按原样返回所请求的资源。否则脚本的输出将返回到浏览器。
这意味着,默认情况下(没有路由器脚本),Web 服务器在将不存在的 URI 路由到文档根目录方面做得非常好index.php
file.
换句话说,假设您的文件结构如下:
lib/
base.php
template.php
etc.
public/
index.php
以下命令足以启动服务器并将请求正确分派到框架:
php -S 0.0.0.0:8090 -t public/
或者,如果您直接从 public/ 文件夹运行命令:
cd public
php -S 0.0.0.0:8090
请注意,应用程序的工作目录取决于您调用命令的文件夹。为了利用这个价值,我强烈建议您添加chdir(__DIR__);
在你的顶部public/index.php
文件。这样,后续的所有require
通话将与您相关public/
文件夹。例如:$f3 = require('../lib/base.php');
路由文件样式 URI
内置服务器,默认情况下, 不会通过不存在的file指向您的 URIindex.php
,如:
如果 URI 请求未指定文件,则返回给定目录中的 index.php 或 index.html
因此,如果您打算用点来定义一些路线,例如:
$f3->route('GET /brew.json','Brew->json');
$f3->route('GET /brew.html','Brew->html');
那么它就不会工作,因为 PHP 不会将请求传递给index.php
.
在这种情况下,您需要调用自定义路由器,例如.htrouter.php
你试图使用。唯一的事情是你的.htrouter.php
显然是为不同的框架设计的(F3 不关心$_GET['url']
但关心$_SERVER['SCRIPT_NAME']
.
这是一个例子.htrouter.php
应该与 F3 一起使用:
// public directory definition
$public_dir=__DIR__.'/public';
// serve existing files as-is
if (file_exists($public_dir.$_SERVER['REQUEST_URI']))
return FALSE;
// patch SCRIPT_NAME and pass the request to index.php
$_SERVER['SCRIPT_NAME']='index.php';
require($public_dir.'/index.php');
NB: the $public_dir
变量应根据位置设置.htrouter.php
file.
例如,如果您致电:
php -S 0.0.0.0:8090 -t public/ .htrouter.php
它应该是$public_dir=__DIR__.'/public'
.
但如果你打电话:
cd public
php -S 0.0.0.0:8090 .htrouter.php
它应该是$public_dir=__DIR__
.