[Heroku] Confファイルでのリダイレクトを設定する

herokuで構築したサイトで、ドキュメントルートにある、 /cgi-bin/ 以下にある特定のファイルへのアクセスがあった場合に、別のディレクトリへリダイレクトさせて欲しい、という要件があった。
普通に設定しようと思ったらかなり深い話になったので備忘録。

/cgi-bin/hoge/hoge.php を、
/abc/hoge/hoge.php へリダイレクトするとする。
(cgi-binディレクトリからabcディレクトリへリダイレクト)

htacessでリダイレクト

まずは何も考えずに .htaccess を利用してのリダイレクトを設定する。

1
2
RewriteEngine on
RewriteRule ^cgi-bin/hoge/hoge.php$ /abc/hoge/hoge.php [R=301,L]

これでアクセスしてみるも、 Not Found の表示。

試しに、/cgi-bin/ のディレクトリを作り、その中にファイルを設置してアクセスしてみるも、同じくNot Found。
リダイレクト以前に、/cgi-bin/ ディレクトリ自体にアクセスが出来ていない。

cgi-bin

apacheのデフォルト設定では、 /cgi-bin/ ディレクトリは別のディレクトリへエイリアスが貼られている事が多いような記述があった。
セキュリティ的にドキュメントルートのcgi-binには直接アクセスさせないようになっているらしい。

CGI用エイリアスの設定(ScriptAlias) – CGIの利用 – Apache入門

Herokuもこの設定が行われているらしく、PHP環境のherokuのconfファイルを確認すると、以下のような設定が書かれている。

1
ScriptAlias /cgi-bin/ "/app/.heroku/php//share/apache2/cgi-bin/"

そのため、ドキュメントルート以下の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
web: vendor/bin/heroku-php-apache2 [options] [<DOCUMENT_ROOT>]

confファイルの読み込み

任意のconfファイルを読みこませるには、2つのオプションがある。
一つは、全く新しいconfファイルを読みこませる方法。これには、小文字のcを使用する。

1
-c <httpd.conf>

これは既存の設定を全て上書きするため、正しく設定出来ていない場合はアプリケーションの起動に失敗するので注意が必要。
デフォルトで読み込まれているconfファイルは以下となる。

https://github.com/heroku/heroku-buildpack-php/blob/master/conf/apache2/heroku.conf

これはあまり指定することはないと思われる。

もう一つは、既存のconfファイルに追加するもの。
こちらは、大文字のCを使う。

1
-C <httpd.inc.conf>

デフォルトで読み込まれているファイルは以下となる。 https://github.com/heroku/heroku-buildpack-php/blob/master/conf/apache2/default_include.conf

このファイルではディレクトリインデックスの設定のみが書かれている状態。 このように、設定したい内容を記述したファイルを作成し、大文字のCオプションで読み込ませることで既存の設定に追加で反映が出来る。

Procfileでの設定

アプリのルートに、 my_app.conf ファイルを作成し読み込ませるとする。
また、ドキュメントルートは htdocs で設定したい場合は、以下の様な内容となる。

1
web: vendor/bin/heroku-php-apache2 -C ./my_app.conf htdocs

ファイルのパスは、 /app からの相対パスでの指定となる。
これでアプリの起動時に、 my_app.conf ファイルが読み込まれることとなる。

confファイルでのリダイレクト

そういうわけで、confファイル内に直接リダイレクトの設定を記述する。
1点注意点としては、 htaccessによる設定の場合は、相対パスで記述する場合は先頭の / が必要ないのだが、
confファイルによる設定の場合は、先頭に / が必要となる。

【mod_rewrite】「.htaccess」と「httpd.conf」での設定による違い – mod rewrite

よって、以下のように記述する。

1
2
RewriteEngine on
RewriteRule ^/cgi-bin/hoge/hoge.php$ /abc/hoge/hoge.php [R=301,L]

ちなみに、デフォルトで読み込まれているファイルに記述されている、ディレクトリインデックスの設定を記述せずに読み込ませると、その設定が消えてしまい、/ でアクセスした場合には、 index.html が最初に呼び出されるようになってしまう。
よって、ディレクトリインデックスの設定も合わせて書いておくと挙動が変わらずに設定できる。 一応、全文は以下。

1
2
3
4
DirectoryIndex index.php index.html index.htm

RewriteEngine on
RewriteRule ^/cgi-bin/hoge/hoge.php$ /abc/hoge/hoge.php [R=301,L]

参考

まとめ

cgi-binディレクトリからリダイレクト、というのは実際の要件としてはめったにあることではないけれど、herokuのPHPの設定として、confファイルをカスタマイズしたい要件はあると思う。
実際、htaccessでのリダイレクトより、confファイルでのリダイレクトのほうが早いようなので出来るならそっちの方がよかったりするだろうし。
herokuは簡単に利用出来る反面、設定が触れずガチガチだと思われガチだけど、結構設定はいじれたりする。

   このエントリーをはてなブックマークに追加