質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

解決済

【Docker】Apache(httpd)の公式コンテナでmod_rewriteを有効にする方法を教えてください。

hasshy
hasshy

総合スコア0

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1回答

0評価

0クリップ

5659閲覧

投稿2018/12/03 15:13

Dockerの公式から取得してきたhttpdコンテナでmod_rewriteの設定ができません。
https://hub.docker.com/_/httpd/

ソースは後述します、mod_rewriteをするために必要な設定はしているはずなのですが、mod_rewriteが有効になりません。
dockerのhttpdを使う場合、何か不足している設定はありますでしょうか?

エラー内容

index.phpにアクセスすると、次のようなエラーが表示されます。

Forbidden
You don't have permission to access / on this server.

ログのエラーは下記で、mod_rewriteに必要な設定がされていないことがわかります。

AH00670: Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive is also f

orbidden due to its similar ability to circumvent directory restrictions : /var/www/html/index.php

設定内容

最終の目的はwordpressサイトを開発環境に再現する事です。

コンテナ構成

もしかしたら、公式のphp+apacheや、wordpressのコンテナを使った方が早いかもしれませんが、理解を深めたいのでそれぞれのコンテナを結合しています。

ディレクトリ構成

public_html配下に.htaccessをおきます。
docker-compose.ymlと同じ階層に、各Dockerfileが下記の構成で配置されています

公開ディレクトリ

public_html/
├── index.php
└── .htaccess

docker関連のファイル

stacks/
├── db
│ └── Dockerfile
├── php
│ └── Dockerfile
└── web
├── Dockerfile
└── apache2
└── conf.d
└── 000-default.conf

ソース

公開ディレクトリ

.htaccess

wordpressの環境なので、次のような設定をしています。

htaccess

# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress

Docker関連

docker-compose.yml

yml

version: "3.2" services: php: build: context: './stacks/php/' volumes: - ./public_html/:/var/www/html/ web: build: context: './stacks/web/' links: - php - db ports: - "8080:80" volumes: - ./public_html/:/var/www/html/ db: build: context: ./stacks/db/

Dockerfile

webサーバーに関係する、stacks/web/Dockerfileのみ記載します

FROM httpd:2.4.33-alpine RUN apk update; \ apk upgrade; ## setting conf.d RUN echo 'IncludeOptional conf.d/*.conf' \ >> /usr/local/apache2/conf/httpd.conf RUN mkdir /usr/local/apache2/conf.d COPY apache2/conf.d/000-default.conf /usr/local/apache2/conf.d/000-default.conf ## setting mod_rewrite RUN sed -i '/LoadModule rewrite_module/s/^#//g' /usr/local/apache2/conf/httpd.conf ## setting log RUN mkdir -p /var/log/apache2/ RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log RUN ln -sf /proc/self/fd/2 /var/log/apache2/error.log
追加するapacheのconfファイル

ファイル名は000-default.confという名前で追加します。
mod_rewiteに必要な、FollowSymLinksと、SymLinksIfOwnerMatchはここで設定します。

conf

ServerName localhost ServerAdmin webmaster@localhost DocumentRoot /var/www/html/ LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so <VirtualHost *:80> DocumentRoot /var/www/html/ CustomLog /proc/self/fd/1 common ErrorLog /proc/self/fd/2 <Directory /var/www/html/> DirectoryIndex index.html index.php Options Indexes FollowSymLinks SymLinksIfOwnerMatch AllowOverride All Require all granted Options Includes AddType text/html .shtml AddOutputFilter INCLUDES .shtml </Directory> <FilesMatch \.php$> SetHandler "proxy:fcgi://php:9000" </FilesMatch> </VirtualHost>

備考

  • httpコンテナに入っているデフォルトのhttp.confファイルには、SymLinksIfOwnerMatch、および、FollowSymLinksを無効にする(先頭に-をつける)設定はありませんでした。
  • 適当に、info.phpと言うファイルを作って、<?php phpinfo() ?>を実行すると設定がみれますので、php自体は実行できています。  
  • confから、fcgiのphpを参照する処理を除いた場合、phpを解析できませんので、追加した設定は有効になっています。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです