无法让 Apache 重写在 Docker PHP-Apache 容器上运行

无法让 Apache 重写在 Docker PHP-Apache 容器上运行

我按照这个论坛上的很多说明、教程和问题进行了操作,但仍然无法正常工作。我使用 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;我已完成以下操作以在本地机器上创建它:

  1. 使用进入容器的虚拟文件系统docker exec -t -i <container_name> /bin/bash
  2. 漫步到/etc/apache2
  3. 通过打印文件内容cat apache2.conf
  4. 将内容复制粘贴到我的本地/apache/apache2.conf文件中
  5. 在该本地文件末尾添加以下指令行:
# 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://localhosthttp://localhost:80都有效;所以看来我的重写规则根本没有被应用。

apachectl configtest在 docker 容器中运行时,我也会得到Syntax OK

只是猜测;这可能与 xdebugs 从容器的端口 9003 传出的通信有关吗?

我错过了什么?

答案1

我其实已经搞清楚了。问题似乎是,使用 docker 时,必须在指定端口的虚拟主机上下文中指定重写规则。至少我已经完成了上面写的内容,加上以下步骤:

  1. 在容器内,我已(在 CLI 中)迁移到文件夹etc/apache2/sites-enabled
  2. 该文件000-default.conf包含当前在相关 Apache 单元上启用的站点的默认配置。就此应用程序而言,修改默认配置是可以的,因为容器将专门用于此 API。至少这是我的想法。
  3. 所以我再次做了同样的事情;通过 复制文件内容,因为它们是随已启动的 docker 容器一起发送的cat 000-default.conf
  4. apache/sites-enabled/000-default.conf复制粘贴本地文件(您新创建的)中的内容
  5. 现在你取出本地文件中先前存在的以下部分apache2.conf(略有改进):
# Rewrite for routing of all requests through REST controller
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]

并将其粘贴到本地000-default.conf文件中;在结束</VirtualHost>标记之前。然后从文件中删除重写规则apache/apache2.conf,但将其保留为添加的ServerName指令。

  1. 然后,您将路径映射添加到 php 容器的卷中,以将自定义虚拟主机默认配置文件加载到容器中,然后就可以开始了;所以您的 docker-compose.yml 变成:
services:

  php:
    ....
    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
      - ./apache/sites-enabled/000-default.conf:/etc/apache2/sites-enabled/000-default.conf
     ....

重写现在已完全可用!我只是想知道,您实际上必须在文件夹的当前活动配置文件中指定重写规则是否正常sites-enabled

相关内容