我已经按照本论坛中的很多说明、教程和问题进行操作,但我仍然无法正常工作。我已经使用 PHP Apache Docker 容器设置了一个 REST API,并且需要在我的 apache 配置中创建一个重写规则以将 API 请求重新路由到index.php
(REST 控制器)。目前,根据下面的内容,我得到了 404:
本地机器上的文件结构(列出除 php 源代码之外的所有内容;此处不需要):
php
conf.d
- error_reporting.ini
- xdebug.ini
Dockerfile
index.php
apache
- apache2.conf
docker-compose.yml
Dockerfile 的内容是:
FROM php:8.1-apache
WORKDIR /var/www/html/
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& a2enmod rewrite
COPY . .
EXPOSE 80
docker-compose.yml 的内容是:
services:
php:
build: ./php
depends_on:
- db
container_name: php-apache
ports:
- 80:80
volumes:
- ./php:/var/www/html
- ./php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
- ./php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
- ./apache/apache2.conf:/etc/apache2/apache2.conf
environment:
MARIADB_HOST: localhost
MARIADB_USER: root
MARIADB_PASSWORD: top_very_secret
MARIADB_DB: apidb
adminer:
image: adminer
depends_on:
- db
restart: always
ports:
- 8080:8080
db:
image: mariadb
container_name: db
volumes:
- maria-db-storage:/var/lib/mysql
environment:
MARIADB_ROOT_PASSWORD: top_very_secret
MARIADB_DATABASE: apidb
volumes:
maria-db-storage:
关于apache2.conf
;的内容 我已完成以下操作以在本地计算机上创建它:
- 使用 . 进入容器的虚拟文件系统
docker exec -t -i <container_name> /bin/bash
。 - 流浪到
/etc/apache2
- 通过打印文件内容
cat apache2.conf
- 将内容复制粘贴到我的本地
/apache/apache2.conf
文件中 - 在该本地文件的末尾添加了以下指令行:
# Custom directives start here
# Set Server's name
ServerName 'localhost'
# Rewrite for routing of all requests through REST controller
RewriteEngine On
# If requested resource is index.php, do nothing
RewriteRule ^index\.php$ - [L]
# If requested resource is a file or directory that does not exist, reroute to REST
# controller index.php
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule . /index.php [L]
在构建镜像并运行容器后,我通过 CLI 再次检查了容器的虚拟文件系统。成功保存了我本地文件的/etc/apache2/apache2.conf
内容,我也在apachectl -M
容器内做了一个,可以看到rewrite_module (shared)
打印出来了。
同样,我只是收到 404;例如,如果我搜索http://localhost/xyz
. 如果我不省略端口(并搜索http://localhost:80/xyz
),则相同。搜索http://localhost
和http://localhost:80
两者都有效;所以我的重写规则似乎根本没有被应用。
apachectl configtest
在 docker 容器中运行时,我也会得到Syntax OK
.
只是猜测;这可能与来自容器端口 9003 的 xdebugs 传出通信有关吗?
我错过了什么?
我其实已经想通了。问题似乎是,在使用 docker 时,您必须在您指定的端口的虚拟主机上下文中指定重写规则。至少我已经完成了上面写的内容,再加上以下步骤:
etc/apache2/sites-enabled
000-default.conf
,包含当前在相关 apache 单元上启用的站点的默认配置。就此应用程序而言,修改默认配置就可以了,因为容器将专门用于此 API。至少那是我的想法。cat 000-default.conf
内容apache/sites-enabled/000-default.conf
文件(您新创建的文件)中apache2.conf
文件中的以下部分(略有改进):并将其粘贴到本地
000-default.conf
文件中;在结束</VirtualHost>
标签之前。然后从文件中删除重写规则apache/apache2.conf
,但将其留给添加的ServerName
指令。重写现在功能齐全!我只是想知道,您实际上必须在文件
sites-enabled
夹的当前活动配置文件中指定重写规则是否正常?