配置 Apache 以重写 API 调用

配置 Apache 以重写 API 调用

我有一个由两部分组成的项目。首先是 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/v1Controller.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。似乎这也被忽略了。不会改变任何东西
  • 以任何可能的组合添加或删除所有尾随字符/。(我绝望了)

在寻找解决方案时,我发现了一个资源,有人说你不能使用AliasRewrite但我还发现有人说这是可能的......我现在很困惑。

我希望有人能帮助我

答案1

这似乎是一个问题:

        RewriteBase    /api/v1/
        RewriteRule    api/v1/(.*)$ api/v1/Controller.php?request=$1 [QSA,NC,L]

请记住,RewriteBase是添加到条件中的RewriteRule。因此,您要求重写以 开头的 URL /api/v1/api/v1/

只需删除重复即可。

相关内容