将外部 /api/entity/1 URL 重写为内部 /api/entity.php/1 (或 /api/entity.php?id=1)的通用方法

Generic way to rewrite external /api/entity/1 URL to internal /api/entity.php/1 (or /api/entity.php?id=1)

我试图在 PHP 中使用 API 我目前在 API 的根目录的 .htaccess 文件中设置了这些重写规则:

# Remove the php extension from the filename
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC,L]

这是为了让对 API 的请求看起来更像“RESTful” - 所以 api/entity.php?id=5 应该是 api/entity?id=5 - 我想去更进一步,并允许请求 URL 如 api/entity/5 成功重写为 api/entity.php/5api/entity.php?id=5.

我正在试验类似这样的 apache 重写规则,它有正则表达式来检测像 entity/{any number here}

这样的路径
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC]
RewriteRule ^(.+)(\/\d+)$ .php [NC,L]

它将在两次捕获中与 entity/5 匹配 entity/5,然后在内部将其定向到 entity.php/5 - 此时在 php 文件我可以对请求 URI 或类似的东西进行分解以从路径中获取值。

但我对 apache 重写的了解还不足以完全实现这一点,因为无论出于何种原因,这条规则都不起作用。我知道我可以为每个目录编写硬编码的重写规则,但我真的宁愿保持这个通用。

如果没有真正的方法来实现我在这里想要的,那么我宁愿坚持像 api/entity?id=5 这样的路径,也不愿编写一大堆重写规则。

我也在想,如果有一种方法可以检测请求何时与目录不匹配(默认情况下会发生像 api/entity/5 这样的路径?) - 它运行一个在这种情况下不同的重写 - 第一个没有 运行 并导致它尝试写入现在内部指向的 URL,但是同样,我不确定如何实现这个。

有更多经验的人可以为我指明正确的方向吗?

正如 Chris Hass 所强调的那样,在这种情况下,实施具有某种变化的 PHP 路由器可能更有意义并且更容易。

以下是我为将来偶然发现此问题的任何人找到的一些示例的链接:

https://medium.com/the-andela-way/how-to-build-a-basic-server-side-routing-system-in-php-e52e613cf241

https://www.taniarascia.com/the-simplest-php-router/

https://www.educative.io/edpresso/how-to-create-a-basic-php-router

显然,如果您不是像我一样有意单独使用 PHP,那么您没有理由不能使用图书馆或使用 Laravel 等来创造您的生活更简单,毕竟为什么要重新发明轮子?