TL;博士
PHP 5.4 内置网络服务器是否有任何关于相对路径的错误或限制?或者是否需要正确(以及额外)配置?
当我习惯主动编程时,我有一个系统在 URI 路由下使用 中的这些行。 .htaccess 文件:
RewriteEngine On
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php [L]
FrontController 收到请求,从 SQLITE 数据库中的给定 URI 中找到正确的路由,然后 Dispatcher 调用 Action Controller。
它与 Apache 配合得非常好。几个月后的今天,我决定使用 PHP 5.4 内置网络服务器运行我的测试应用程序。
我注意到的第一件事,很明显, .htaccess 不工作,所以我改用代码文件:
<?php
if( preg_match( '/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"] ) ) {
return false;
}
include __DIR__ . '/index.php';
并像这样启动网络服务器:
php.exe -c "php.ini" -S "localhost:8080" "path\to\testfolder\routing.php"
到现在为止还挺好。我的应用程序需要引导的一切都可以通过修改 include_path 来完成,如下所示:
set_include_path(
'.' . PATH_SEPARATOR . realpath( '../common/next' )
);
正在 下一个 一个文件夹中所有模块的核心文件夹,其中包含我拥有的所有应用程序共有的所有内容。为此,它不需要任何进一步的解释。
没有自动加载器 我见过的技术能够自动加载,所以唯一需要手动加载的类就是我的 Autoloader。但是在运行测试应用程序后,我收到一个错误,因为找不到我的 AutoLoader。 o.O
我一直对 realpath() 非常怀疑,所以我决定用这个 的完整和绝对路径来更改它。下一个 目录,它工作。它不应该像我一样需要做,但它确实有效。
我的自动加载器已被 spl_autoload_register() 加载并成功注册。作为引用,这是自动加载功能(当然只有闭包):
function( $classname ) {
$classname = stream_resolve_include_path(
str_replace( '\\', DIRECTORY_SEPARATOR, $classname ) . '.php'
);
if( $classname !== FALSE ) {
include $classname;
}
};
但是,找不到位于 index.php 路径内的资源,例如 MVC 类。所以我做了一些我也不应该做的事情,并将工作目录添加到 include_path。再一次,手动,不依赖 realpath():
set_include_path(
'.' . PATH_SEPARATOR . 'path/to/common/next'
. PATH_SEPARATOR . 'path/to/htdocs/testfolder/'
);
它再次起作用了……几乎! >.<
我可以使用这个系统创建的大多数应用程序都可以很好地与基于 SQLITE 数据库的标准路由器一起使用。为了让事情变得更简单,这个路由器在工作目录中寻找一个预定义的 SQLITE 文件。
当然,我还提供了一种更改此默认条目的方法,以防万一,因此我检查此文件是否存在,如果不存在则触发错误。
这是我看到的具体错误。检查例程是这样的:
if( ! file_exists( $this -> options -> dbPath ) ) {
throw RouterException::connectionFailure(
'Routes Database File %s doesn\'t exist in Data Directory',
array( $this -> options -> dbPath )
);
}
数据库路径 条目,如果未更改,则使用常量值 数据/Routes.sqlite ,相对于工作目录。
如果我再次手动设置绝对路径,一切(真的)工作,请求流成功到达 Action Controller 。
这是怎么回事?
最佳答案
这是 PHP 内置 Web 服务器中的一个错误 从 PHP 版本 5.6.30 开始,这仍未修复。
简而言之,Web 服务器不会重定向到 www.foo.com/bar/
。如果 www.foo./bar
被请求并且恰好是一个目录。客户端为服务器www.foo.com/bar
, 假设它是一个文件(因为末尾缺少斜杠),因此所有后续相对链接都将相对于 www.foo.com/
获取而不是 www.foo.com/bar/
.
A bug ticket was opened早在 2013 年,但被错误地设置为“不是错误”的状态。
我在 2017 年遇到了类似的问题,所以我在 bug 票上留下了评论。
编辑:刚刚注意到@jens-a-koch 打开了我链接的票。我不同意他对原始问题的评论。
关于webserver - PHP 内置 Web 服务器和相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095425/