将 mod_rewrite 添加到 Docker 映像 httpd:alpine

Posted

技术标签:

【中文标题】将 mod_rewrite 添加到 Docker 映像 httpd:alpine【英文标题】:Add mod_rewrite to Docker image httpd:alpine 【发布时间】:2018-09-23 09:15:23 【问题描述】:

老实说,我几乎没有使用 Alpine Linux 的经验,但我喜欢它的方法,因此想改变它。我对 Docker 也比较陌生,所以如果这是一个“愚蠢”的问题,请多多包涵。

我想要实现的是在 httpd:alpine 图像的基础上构建并将 HTTPd 扩展到我的需要。

这将包括激活 mod_rewrite 模块并将自定义 .htaccess 复制到图像中。

这是我目前所拥有的:

FROM httpd:alpine

# Copy .htaccess into DocumentRoot
COPY ./.htaccess /var/www/html/

RUN apk update
RUN apk upgrade
RUN apk add apache2-utils
RUN a2enmod rewrite
RUN rc-service apache2 restart

我现在的问题是,我经常收到“a2enmod not found”错误,我不知道如何解决。这可能是因为 a2enmod 是纯 Debian/Ubuntu/... 的东西,但我不知道激活 mod_rewrite (或任何模块)的任何替代方法。

非常感谢大家的支持!

【问题讨论】:

这对我有帮助,我同意在 RUN a2enmod 中重写 dockerfile 并工作。 【参考方案1】:

mod_rewrite在alpine中默认是用apache安装的,所以不需要重新安装。以下是在 Alpine 中启用 mod_rewrite 的方法:

FROM httpd:alpine

# Copy .htaccess into DocumentRoot
COPY ./.htaccess /var/www/html/

RUN sed -i '/LoadModule rewrite_module/s/^#//g' /usr/local/apache2/conf/httpd.conf

RUN  \
  echo 'IncludeOptional conf.d/*.conf'; \
 >> /usr/local/apache2/conf/httpd.conf \
  && mkdir /usr/local/apache2/conf.d

【讨论】:

非常感谢您的快速回复!我完全按照您在答案中提供的更改进行了更改,但仍然无法使其正常工作。可以构建 docker 镜像并且可以运行容器,但是重写规则不起作用。我认为这是缺少“AllowOverride”指令吗?如果是这样,我将如何通过 sed 激活它?为了进一步参考,我将把我的 .htaccess 的内容放在这里:Options +FollowSymLinks RewriteEngine on RewriteRule ^(.*)$ https://www.youtube.com [R=301,L] (是的,我现在想把对我服务器的调用转发到 youtube。) @Archivar 该帖子没有解决您的问题,因为我认为它对您不起作用。请不要将其标记为正确答案。 @Archivar yes 以上 DockerFile 对我不起作用。请不要标记为正确。 也许在 2018 年 4 月一切正常,也许从那以后情况发生了变化,也许你不应该简单地复制和粘贴,甚至不去尝试了解发生了什么——但也许答案就是错误的。大声笑【参考方案2】:

我想你想要一个有效的 .htaccess 重写机制。 为此,您需要做两件事:

在 httpd.conf 中通过取消注释行启用 mod_rewrite:

LoadModule rewrite_module modules/mod_rewrite.so

在 httpd.conf 中将工作目录的 AllowOverride 更改为 All(不要更改每个 AllowOverride,因为这是安全问题)

AllowOverride All

从容器中下载 httpd.conf,更改此值,然后在构建镜像时将新的 httpd.conf 上传到同一目录是一个好习惯:

例如

提取 httpd.conf docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf

上传新的 httpd.confon 构建过程: 复制./my-httpd.conf /usr/local/apache2/conf/httpd.conf

【讨论】:

以上是关于将 mod_rewrite 添加到 Docker 映像 httpd:alpine的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用mod_rewrite将单个页面重定向到HTTPS

使用 Mod_Rewrite 将 ROOT 重写到另一个路径

使用 Mod_rewrite 将 HTTP 重定向到 HTTPS

子域 mod_rewrite (htaccess) 到相对目录

Apache mod_rewrite - 根本不会发生重写

mod_rewrite:子域到控制器