由于我想了解有关托管 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 中的设置,但不知道要查找什么。有什么建议吗?
要通过index.php路由所有请求并确保$_SERVER["REQUEST_URI"]包含客户端请求的完整路径,您需要修改Apache配置以使用URL重写。这可以通过 mod_rewrite 模块来完成,它允许您动态重写 URL。
设置方法如下:
首先,确保 Apache 中启用了 mod_rewrite 模块:
sudo a2enmod rewrite
sudo systemctl restart apache2
您需要添加一个 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