如何将所有请求重定向到 apache2 子目录内的 PHP 文件?

How to redirect all requests to a PHP file inside a subdirectory in apache2?

我的文档根目录是 /var/www/html/

我在里面创建了一个名为myapi的目录,如/var/www/html/myapi

/var/www/html/myapi中的文件夹结构类似于

.
|-- .htaccess
|-- composer.json
|-- composer.lock
|-- src
|   |-- config
|   |-- index.php
`-- vendor

我希望将所有请求(例如 http:localhost/myapi/books 重定向到 src 文件夹内的 index.php。

我当前的 .htaccess 设置:

RewriteEngine On
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]

RewriteEngine 已经开启。 但是不行,服务器也没有响应。

我可以知道怎么做吗?

编辑:已修复。我搞砸了 docker 容器中 .htaccess 文件的一些卷挂载。

在 .htaccess 中使用以下代码。我希望它应该工作

RewriteEngine On
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php?page= [QSA,L]
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]

...may I know how my .htaccess could be improved?

正如我在评论中提到的,这是“好的”,但可以改进。

此规则不必要地重写为自身。这里没有 rewrite-loop,因为您正在重写静态 file-path。 (但是在 substitution 字符串上包含一个斜杠前缀,你会得到一个 rewrite-loop - 500 内部服务器错误。)

没有必要捕获整个 URL-path(即 (.*)),因为它没有被使用。

检查请求是否以已知文件扩展名结尾的条件可以移动到RewriteRule 模式. (不需要 RewriteCond 指令。)从正则表达式交替中删除点以“简化”正则表达式。考虑将 .php 添加到已知文件扩展名列表中,and/or 使用 END 标志 (Apache 2.4) 而不是 L 以防止重写引擎进一步循环。

不需要 QSA 标志,因为您没有在 substitution 字符串上附加查询字符串。默认传递查询字符串。

例如,改用以下内容:

RewriteRule !\.(png|jpe?g|gif|zip|css|svg|js)$ src/index.php [END]