質問: **環境** docker-compose.yml appコンテナ php:7.4-apache dbコンテナ mysql:5.5(MySQLのバージョンはHerokuアドオンのClearDBに合わせている) エラー画面はこのような形です↓ ``` Forbidden You don't have permission to access this resource. Apache/2.4.38 (Debian) Server at afternoon-atoll-83846.herokuapp.com Port 80 ``` heroku logsでエラーログを確認したところ以下のようなエラーを発見いたしました。↓ ``` [autoindex:error] [pid 21] [client 10.43.252.33:26285] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.php,index.html) found, and server-generated directory index forbidden by Options directive ``` エラー文などから解読を試みましたが、解決の糸口が見つけられずにいます。お忙しいところ恐縮ではありますが何かご教示いただけないでしょうか。 エラーが発生するまでの流れはこちらになります↓ 初めてのデプロイの際は上手くいく。 新しいアプリのデプロイをする際にchmodで権限を付与したら、どちらも立ち上がらなくなる。 追記 再度heroku logsでエラー表示しましたら少し違うエラーログが出力されました。 ``` AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.php,index.html) found, and server-generated directory index forbidden by Options directive, referer: https://dashboard.heroku.com/ ``` **3つあるアプリの中の2つが動かない** 1つは公式サイトにのっているサンプルアプリです。こちらは正常に動作します。 尚、前提知識のこの部分が足りない、もしかしたらこうなんじゃないか、質問の仕方を変えてみてはなどのお言葉でも有り難いのでよろしくお願いいたします! レスポンスは基本早いです! ![PHPファイル](https://i.stack.imgur.com/GsrTe.png) ![Procfile](https://i.stack.imgur.com/ap3Jf.png)
回答: `ls -al` をしながら `.git` のあるディレクトリを確かめてください。そのディレクトリに Procfile を置きこう書き換えましょう。 ``` web: vendor/bin/heroku-php-apache2 ``` ### 解説(興味あれば読んでみてね) Heroku はソースコードが送られてくると `compile` というスクリプトが走ります。そこで PHP とそのライブラリの準備をします。ついでに Procfile を何も書かないと `heroku-php-apache2` というスクリプトが走ります。 それで `heroku-php-apache2` が走ると Apache(Web サーバー)の準備をして起動し、PHP が動くようにしてくれます。Web サーバーというのはどこか配信するディレクトリの出発点(ルートディレクトリ)がなければいけません。これが `Procfile` の引数を書かないと**リポジトリのディレクトリ(`.git` ディレクトリのあるディレクトリ)**になるよう設定されています。代わりに引数に**相対パス**を渡してあげるとリポジトリの開始地点からみたときのそのディレクトリになります。 そしてなぜいきなり `/var/www/html/` という謎のディレクトリがでてくるのかというと、これも Apache の設定からくるものです。この Apache はディレクトリ名でアクセス(例えば というように最後尾にスラッシュがつく形)すると勝手に `<リポジトリディレクトリ>/foo/` から `index.php` や `index.html` を探し、その結果を表示するように設定されています。そしてその結果がないとデフォルトでは `/var/www/html/` を探しに行くようになっています。`/var/www/html/` はなにもおいてありませんのでエラーが出る、というわけです。 更に突っ込んだ話をすると探しものが見つからなかったので出すべきエラーは「404 Not found」じゃないの?となるかもしれませんが実は「403 Forbidden」であっています。昔の Web サーバーはディレクトリにアクセスするとそのディレクトリのファイルリスト一覧を返すようになっていました。しかしそれではセキュリティ上危険なため、Web サーバーの設定でファイルリストを見れなくするよう「禁止」したのです。