配置 Apache2 以托管 REST API

问题描述 投票:0回答:1

由于我想了解有关托管 REST API 以及此类开发(使用 PHP)的更多信息,我想知道以下内容: 我的 API 文件位于路径 /var/myapi 中,并配置了如下目录:

<Directory /var/myapi>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

虚拟主机配置如下:

<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/myapi/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

在我的 api 目录中,我希望 index.php 是我的路由器。因此,

$_SERVER["REQUEST_URI"]
应包含客户端请求的完整路径。

不幸的是,当访问 http://localhost:8080/books 时,路径

/books
将由 apache 处理,它试图在
/var/msapi/books
中查找文件。路径``/books`不会反映在我的路由器 PHP 代码中。

我认为我需要更改 Apache 中的设置,但不知道要查找什么。有什么建议吗?

php apache
1个回答
0
投票

要通过index.php路由所有请求并确保$_SERVER["REQUEST_URI"]包含客户端请求的完整路径,您需要修改Apache配置以使用URL重写。这可以通过 mod_rewrite 模块来完成,它允许您动态重写 URL。

设置方法如下:

  1. 启用 mod_rewrite 模块

首先,确保 Apache 中启用了 mod_rewrite 模块:

sudo a2enmod rewrite
sudo systemctl restart apache2
  1. 更新 Apache 虚拟主机配置

您需要添加一个 RewriteRule 将所有请求重定向到index.php,现有文件和目录除外。

<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/myapi/

    <Directory /var/myapi>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted

        # Enable URL Rewriting
        RewriteEngine On

        # Check if the request is for a file or directory that exists
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        # If not, redirect all requests to index.php
        RewriteRule ^ index.php [L,QSA]
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

更新后的 VirtualHost 配置应如下所示:

创建 .htaccess 文件(可选)

或者,如果您不想直接修改 VirtualHost 配置,则可以使用 /var/myapi 目录中的 .htaccess 文件。确保 VirtualHost 配置中的 AllowOverride 指令设置为 All,以允许 .htaccess 覆盖配置。

在 /var/myapi 中创建 .htaccess 文件:

RewriteEngine On

# Check if the request is for a file or directory that exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# If not, redirect all requests to index.php
RewriteRule ^ index.php [L,QSA]

进行更改后,重新启动 Apache 以应用配置:

sudo systemctl restart apache2
© www.soinside.com 2019 - 2024. All rights reserved.