[Heroku] Confファイルでのリダイレクトを設定する
herokuで構築したサイトで、ドキュメントルートにある、 /cgi-bin/
以下にある特定のファイルへのアクセスがあった場合に、別のディレクトリへリダイレクトさせて欲しい、という要件があった。
普通に設定しようと思ったらかなり深い話になったので備忘録。
/cgi-bin/hoge/hoge.php
を、
/abc/hoge/hoge.php
へリダイレクトするとする。
(cgi-binディレクトリからabcディレクトリへリダイレクト)
htacessでリダイレクト
まずは何も考えずに .htaccess
を利用してのリダイレクトを設定する。
1 2 |
|
これでアクセスしてみるも、 Not Found の表示。
試しに、/cgi-bin/
のディレクトリを作り、その中にファイルを設置してアクセスしてみるも、同じくNot Found。
リダイレクト以前に、/cgi-bin/
ディレクトリ自体にアクセスが出来ていない。
cgi-bin
apacheのデフォルト設定では、 /cgi-bin/
ディレクトリは別のディレクトリへエイリアスが貼られている事が多いような記述があった。
セキュリティ的にドキュメントルートのcgi-binには直接アクセスさせないようになっているらしい。
CGI用エイリアスの設定(ScriptAlias) – CGIの利用 – Apache入門
Herokuもこの設定が行われているらしく、PHP環境のherokuのconfファイルを確認すると、以下のような設定が書かれている。
1
|
|
そのため、ドキュメントルート以下のcgi-binディレクトリにファイルをおいても、上記ディレクトリには該当のファイルがなく、not foundとなっていたよう。
さらに、htaccessよりも、confファイルの方が早く呼ばれるため、htaccessでのリダイレクトが効く前に上記にエイリアスで飛ばされ、htaccessによるリダイレクトも効かなかった事が原因だった。
confファイル
herokuのPHPのビルドパックでは、Procfileにて任意のconfファイルを読みこませる事が出来るよう。 そこで、そのconfファイルにてリダイレクト設定を書くことで対応する。
Procfile
Procfileでの設定内容のオプションなどは、PHPのビルドパックのソース内に書かれている。
https://github.com/heroku/heroku-buildpack-php/blob/master/bin/heroku-php-apache2#L46
このヘルプの通り、以下の書式で記述することが可能。
1
|
|
confファイルの読み込み
任意のconfファイルを読みこませるには、2つのオプションがある。
一つは、全く新しいconfファイルを読みこませる方法。これには、小文字のcを使用する。
1
|
|
これは既存の設定を全て上書きするため、正しく設定出来ていない場合はアプリケーションの起動に失敗するので注意が必要。
デフォルトで読み込まれているconfファイルは以下となる。
https://github.com/heroku/heroku-buildpack-php/blob/master/conf/apache2/heroku.conf
これはあまり指定することはないと思われる。
もう一つは、既存のconfファイルに追加するもの。
こちらは、大文字のCを使う。
1
|
|
デフォルトで読み込まれているファイルは以下となる。 https://github.com/heroku/heroku-buildpack-php/blob/master/conf/apache2/default_include.conf
このファイルではディレクトリインデックスの設定のみが書かれている状態。 このように、設定したい内容を記述したファイルを作成し、大文字のCオプションで読み込ませることで既存の設定に追加で反映が出来る。
Procfileでの設定
アプリのルートに、 my_app.conf
ファイルを作成し読み込ませるとする。
また、ドキュメントルートは htdocs
で設定したい場合は、以下の様な内容となる。
1
|
|
ファイルのパスは、 /app
からの相対パスでの指定となる。
これでアプリの起動時に、 my_app.conf
ファイルが読み込まれることとなる。
confファイルでのリダイレクト
そういうわけで、confファイル内に直接リダイレクトの設定を記述する。
1点注意点としては、 htaccess
による設定の場合は、相対パスで記述する場合は先頭の /
が必要ないのだが、
confファイルによる設定の場合は、先頭に /
が必要となる。
【mod_rewrite】「.htaccess」と「httpd.conf」での設定による違い – mod rewrite
よって、以下のように記述する。
1 2 |
|
ちなみに、デフォルトで読み込まれているファイルに記述されている、ディレクトリインデックスの設定を記述せずに読み込ませると、その設定が消えてしまい、/
でアクセスした場合には、 index.html
が最初に呼び出されるようになってしまう。
よって、ディレクトリインデックスの設定も合わせて書いておくと挙動が変わらずに設定できる。
一応、全文は以下。
1 2 3 4 |
|
参考
- 【mod_rewrite】「httpd.conf」での設定方法 – mod rewrite
- Customizing Web Server and Runtime Settings for PHP | Heroku Dev Center
まとめ
cgi-binディレクトリからリダイレクト、というのは実際の要件としてはめったにあることではないけれど、herokuのPHPの設定として、confファイルをカスタマイズしたい要件はあると思う。
実際、htaccessでのリダイレクトより、confファイルでのリダイレクトのほうが早いようなので出来るならそっちの方がよかったりするだろうし。
herokuは簡単に利用出来る反面、設定が触れずガチガチだと思われガチだけど、結構設定はいじれたりする。