我有一个由两部分组成的项目。首先是 API,所有数据请求都由它处理。其次是 Web 客户端,以便用户可以方便地使用该工具。因此,Web 客户端只需进行 API 调用即可。
项目结构如下:
/var/www
/myproject
/api
/v1
Controller.php /* this is the API v1 controller */
/webclient
/views /* just some templates ... */
/public /* all public stuff, like css, html, images, ... */
index.php /* index file for web client */
我将 Apache 配置为具有/var/www/myproject/webclient/public
文档根目录,并且我有一个Alias
,以便对 的调用myproject.host.loc/api/v1/Controller.php?<much-params>
将被重定向到/var/www/myproject/api/v1
。
我现在想要有“更漂亮”的 API 调用,例如:
myproject.host.loc/api/v1/add-item?name=fubar&api-key=4234&token=6344
代替:
myproject.host.loc/api/v1/Controller.php?request=add-item&name=fubar&api-key=4234&token=6344
因此,我想映射每个请求的 URI /api/v1
,Controller.php
然后让脚本完成剩下的工作。我不希望/var/www/myproject/api/v1
直接访问任何其他资源或脚本。
我尝试使用以下 Apache 虚拟主机来做到这一点:
<VirtualHost *:80>
DocumentRoot /var/www/myproject/webclient/public
ServerName myproject.host.loc
Alias /api/v1 /var/www/myproject/api/v1
<Directory /var/www/myproject/api/v1>
RewriteBase /api/v1/
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/v1/(.*)$ api/v1/Controller.php?request=$1 [QSA,NC,L]
</Directory>
</VirtualHost>
Webclient 出现了,但我想要调用 API 的方式不起作用。如果我myproject.host.loc/api/v1
在浏览器中打开,它只会显示Index of /api/v1
包含每个文件的。似乎重写规则被完全忽略了。我也可以用“旧”方式访问 API,但我想用新的“更漂亮”的调用来替换它。(也是出于安全原因,这样只有控制器可以从外部调用)
我怎样才能做到这一点?我尝试了几种方法,包括:
- 完全删除
Alias
并替换为Rewrite
。这会导致无限循环,否则我必须使用带有 URL 的 Web 客户端myproject.host.loc/webclient/public
... - 有或没有
RewriteBase
。似乎这也被忽略了。不会改变任何东西 - 以任何可能的组合添加或删除所有尾随字符
/
。(我绝望了)
在寻找解决方案时,我发现了一个资源,有人说你不能使用Alias
,Rewrite
但我还发现有人说这是可能的......我现在很困惑。
我希望有人能帮助我
答案1
这似乎是一个问题:
RewriteBase /api/v1/
RewriteRule api/v1/(.*)$ api/v1/Controller.php?request=$1 [QSA,NC,L]
请记住,RewriteBase
是添加到条件中的RewriteRule
。因此,您要求重写以 开头的 URL /api/v1/api/v1/
。
只需删除重复即可。