将外部 /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/5
或 api/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://www.taniarascia.com/the-simplest-php-router/
https://www.educative.io/edpresso/how-to-create-a-basic-php-router
显然,如果您不是像我一样有意单独使用 PHP,那么您没有理由不能使用图书馆或使用 Laravel 等来创造您的生活更简单,毕竟为什么要重新发明轮子?
我试图在 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/5
或 api/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://www.taniarascia.com/the-simplest-php-router/
https://www.educative.io/edpresso/how-to-create-a-basic-php-router
显然,如果您不是像我一样有意单独使用 PHP,那么您没有理由不能使用图书馆或使用 Laravel 等来创造您的生活更简单,毕竟为什么要重新发明轮子?