AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1115336
Accepted
DevelJoe
DevelJoe
Asked: 2022-11-11 06:48:26 +0800 CST2022-11-11 06:48:26 +0800 CST 2022-11-11 06:48:26 +0800 CST

无法让 Apache 重写以在 Docker PHP-Apache 容器上工作

  • 772

我已经按照本论坛中的很多说明、教程和问题进行操作,但我仍然无法正常工作。我已经使用 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://localhost和http://localhost:80两者都有效;所以我的重写规则似乎根本没有被应用。

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

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

我错过了什么?

apache-2.4
  • 1 1 个回答
  • 192 Views

1 个回答

  • Voted
  1. Best Answer
    DevelJoe
    2022-11-11T07:23:38+08:002022-11-11T07:23:38+08:00

    我其实已经想通了。问题似乎是,在使用 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夹的当前活动配置文件中指定重写规则是否正常?

    • 1

相关问题

  • %{REQUEST_FILENAME}.ext 是什么意思?为什么额外的 .ext 结尾?

  • 为什么我的 Apache 能够提供 200 个包含斜杠的 .php 文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve