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

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

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

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

Docker

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

Q&A

解決済

1回答

8105閲覧

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

hasshy

総合スコア102

Apache

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

Docker

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

0グッド

0クリップ

投稿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

1# BEGIN WordPress 2<IfModule mod_rewrite.c> 3RewriteEngine On 4RewriteBase / 5RewriteRule ^index.php$ - [L] 6RewriteCond %{REQUEST_FILENAME} !-f 7RewriteCond %{REQUEST_FILENAME} !-d 8RewriteRule . /index.php [L] 9</IfModule> 10# END WordPress

Docker関連

docker-compose.yml

yml

1version: "3.2" 2services: 3 php: 4 build: 5 context: './stacks/php/' 6 volumes: 7 - ./public_html/:/var/www/html/ 8 web: 9 build: 10 context: './stacks/web/' 11 links: 12 - php 13 - db 14 ports: 15 - "8080:80" 16 volumes: 17 - ./public_html/:/var/www/html/ 18 db: 19 build: 20 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

1ServerName localhost 2ServerAdmin webmaster@localhost 3 4DocumentRoot /var/www/html/ 5 6LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so 7LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so 8LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so 9 10<VirtualHost *:80> 11 DocumentRoot /var/www/html/ 12 13 CustomLog /proc/self/fd/1 common 14 ErrorLog /proc/self/fd/2 15 16 <Directory /var/www/html/> 17 DirectoryIndex index.html index.php 18 19 Options Indexes FollowSymLinks SymLinksIfOwnerMatch 20 AllowOverride All 21 Require all granted 22 23 Options Includes 24 AddType text/html .shtml 25 AddOutputFilter INCLUDES .shtml 26 27 </Directory> 28 29 <FilesMatch .php$> 30 SetHandler "proxy:fcgi://php:9000" 31 </FilesMatch> 32</VirtualHost> 33

備考

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

<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>

上記の /var/www/html には2つの Options 指定がありますよね。
Options 指定は上書きされますので、最初の Indexes FollowSymLinks SymLinksIfOwnerMatch は上書きされてしまっているのだと思います。
両方指定したいのであれば、1つにまとめるか +Options で指定しましょう。

投稿2018/12/04 07:04

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2018/12/06 14:38

ご返答ありがとうございます! 確認が遅れてしまい失礼しました。 Optionsを一つにまとめたところ解決しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問