

**環境**  
docker-compose.yml appコンテナ  
php:7.4-apache dbコンテナ  
mysql:5.5(MySQLのバージョンはHerokuアドオンのClearDBに合わせている)

エラー画面はこのような形です↓

[code]

    Forbidden
    You don't have permission to access this resource.
    
    Apache/2.4.38 (Debian) Server at afternoon-atoll-83846.herokuapp.com Port 80
    
[/code]

heroku logsでエラーログを確認したところ以下のようなエラーを発見いたしました。↓

[code]

    [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
    
[/code]

エラー文などから解読を試みましたが、解決の糸口が見つけられずにいます。お忙しいところ恐縮ではありますが何かご教示いただけないでしょうか。

エラーが発生するまでの流れはこちらになります↓  
初めてのデプロイの際は上手くいく。  
新しいアプリのデプロイをする際にchmodで権限を付与したら、どちらも立ち上がらなくなる。

追記  
再度heroku logsでエラー表示しましたら少し違うエラーログが出力されました。

[code]

    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/
    
[/code]

**3つあるアプリの中の2つが動かない**  
1つは公式サイトにのっているサンプルアプリです。こちらは正常に動作します。

尚、前提知識のこの部分が足りない、もしかしたらこうなんじゃないか、質問の仕方を変えてみてはなどのお言葉でも有り難いのでよろしくお願いいたします！  
レスポンスは基本早いです！

[![PHPファイル](https://i.stack.imgur.com/GsrTe.png)](https://i.stack.imgur.com/GsrTe.png)

[![Procfile](https://i.stack.imgur.com/ap3Jf.png)](https://i.stack.imgur.com/ap3Jf.png)


CC BY-SA 4.0
2020-12-28T06:59:55.860
72940
2023-03-01T06:02:00.170
2020-12-30T01:42:48.853
42289
42289
question
php docker apache heroku
Herokuへデプロイした際に、403Forbiddenになってしまう


`ls -al` をしながら `.git` のあるディレクトリを確かめてください。そのディレクトリに Procfile を置きこう書き換えましょう。

[code]

    web: vendor/bin/heroku-php-apache2 <src への相対パス>
    
[/code]

### 解説（興味あれば読んでみてね）

Heroku はソースコードが送られてくると `compile` というスクリプトが走ります。そこで PHP とそのライブラリの準備をします。ついでに
Procfile を何も書かないと `heroku-php-apache2` というスクリプトが走ります。

それで `heroku-php-apache2` が走ると Apache（Web サーバー）の準備をして起動し、PHP が動くようにしてくれます。Web
サーバーというのはどこか配信するディレクトリの出発点（ルートディレクトリ）がなければいけません。これが `Procfile` の引数を書かないと
**リポジトリのディレクトリ（`.git` ディレクトリのあるディレクトリ） **になるよう設定されています。代わりに引数に**
相対パス**を渡してあげるとリポジトリの開始地点からみたときのそのディレクトリになります。

そしてなぜいきなり `/var/www/html/` という謎のディレクトリがでてくるのかというと、これも Apache の設定からくるものです。この
Apache はディレクトリ名でアクセス（例えば <https://example.net/foo/> というように最後尾にスラッシュがつく形）すると勝手に
`<リポジトリディレクトリ>/foo/` から `index.php` や `index.html`
を探し、その結果を表示するように設定されています。そしてその結果がないとデフォルトでは `/var/www/html/`
を探しに行くようになっています。`/var/www/html/` はなにもおいてありませんのでエラーが出る、というわけです。

更に突っ込んだ話をすると探しものが見つからなかったので出すべきエラーは「404 Not found」じゃないの？となるかもしれませんが実は「403
Forbidden」であっています。昔の Web
サーバーはディレクトリにアクセスするとそのディレクトリのファイルリスト一覧を返すようになっていました。しかしそれではセキュリティ上危険なため、Web
サーバーの設定でファイルリストを見れなくするよう「禁止」したのです。


CC BY-SA 4.0
2020-12-30T14:10:38.173
72986
2020-12-30T14:10:38.173
39645
72940
answer