有没有办法允许在 php 中的请求 url 中使用点?

Is there a way to allow dots in request urls in php?

当请求 url 中有一个点时,我收到一个 404 错误 Not found 页面,显示“请求的资源 /error.example 在此服务器上找不到。”是什么导致了这个错误,有没有办法修复它?我正在使用 Slim 框架和 运行 我的代码以及 php 内置服务器。我将在下面放一个重现上述错误的示例代码。

index.php:

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/{name}/oth', function (Request $request, Response $response, array $args) {
    $name = $args['name'];
    $response->getBody()->write($name);
    return $response;
});

$app->run();

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

index.php 和 .htaccess 都位于 public 文件夹内,我 运行 我的代码 php -S localhost:8080 -t public/ 当我转到浏览器并输入地址 http://localhost:8080/name/oth 时,它会正确显示名称,但是当我输入 http://localhost:8080/name.ex/oth 时,它会显示我提到的错误
未找到
请求的资源 /name.ex/oth 在此服务器上找不到。

编辑:
添加请求的信息:
-登录php -S localhost:8080 -t public/
PHP 8.1.2 开发服务器 (http://localhost:8080) 已启动

-请求日志url http://localhost:8080/name/oth:
[::1]:63906 [200]: GET /name/oth

-请求日志url http://localhost:8080/name.ex/oth:
[::1]:63917 [404]: GET /name.ex/oth - 没有这样的文件或目录

如果我将 index.php 替换为 echo 'here'; die;,它会在浏览器中正确显示“此处”。

PHP那里负责,不苗条

[::1]:63917 [404]: GET /name.ex/oth - No such file or directory

此日志消息源自 php built-in 网络服务器,而不是 slim - 从“没有这样的文件或目录”中隐含该请求已被视为文件路径。

如果响应看起来像这样(php 紫色 :)),即不同于您自己的脚本可能生成的任何内容,这也是它来自 built-in 网络服务器的有力证据。

这很可能与 php 开发服务器的已知行为有关,将任何 url 中带有 . 的文件路径视为文件路径,而 将请求转发到任何 php 脚本 - 例如参见 [​​=16=].

指定路由器脚本

这里的修复很简单,在启动 php development server:

时指定一个“路由器脚本”

If a PHP file is given on the command line when the web server is started it is treated as a "router" script.

这也是slim的own documentation说的使用webserver的方式,适配问题使用:

$ php -S localhost:8080 -t public/ public/index.php

使用服务器 运行 显式路由器脚本,应该可以解决请求未到达 index.php:

的直接问题
$ curl -i http://localhost:8080/blah.ex/blah
HTTP/1.1 200 OK
Host: localhost:8080
Date: Sun, 20 Mar 2022 20:33:58 GMT
Connection: close
X-Powered-By: PHP/8.0.11
Content-type: text/html; charset=UTF-8

...whatever public/index.php returns...