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

问题描述

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

# Remove the php extension from the filename
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.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 ^([^\.]+)$ $1.php [NC]
RewriteRule ^(.+)(\/\d+)$ $1.php$2 [NC,L]

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

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

如果没有真正的方法可以在这里实现我想要的,那么我宁愿坚持喜欢的路径,而api/entity?id=5不是需要编写一大堆重写规则。

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

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

标签: phpapache.htaccessmod-rewriteurl-rewriting

解决方案


正如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.education.io/edpresso/how-to-create-a-basic-php-router

显然,如果你不是像我一样故意只使用 PHP,那么你没有理由不能使用库或使用 Laravel 等来让你的生活更轻松,为什么还要重新发明轮子呢?


推荐阅读