webserver - PHP 内置 Web 服务器和相对路径

标签 webserver relative-path php-5.4

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/

相关文章:

c# - 获取文件的相对路径 C#

php - doctrine2 中的自定义 DQL 函数

gd - PHP < 5.5 的 imagecrop() 替代方案

Airflow DAG - 失败的任务没有显示应有的失败状态

java - 在 Linux 上,人们是 chroot Java Web 应用程序还是使用 IPTables 并以非 root 身份运行?

windows - 批量 - 解析相对路径

windows - 我在哪里可以获得为 Windows 预编译的 PHP 5.4 的 MongoDB PHP 驱动程序?

c# - 处理大文件的 .NET Web 服务线程被中止

web - 在 Service Stack REST API 服务中使用 SignalR

c# - 在 C# 中使用相对路径的 SSIS 远程执行