HerokuとかPaaS上のEthnaのURLを、パラメータ使ってもイイ感じにする

_この記事はEthna超超超初心者向けの内容です。_

どうも、[M_Ishikawa](http://about.me/M_Ishikawa)です。Advent Calendar 2回目の投稿です！

1回目の投稿 [HerokuとかPaaS上のEthnaのURLをイイ感じにする](http://qiita.com/items/ddf29e312ad1d10a7460) をやったあと、またまた問題に直面してしまいました。。

それは、URLパラメータを渡す時です。


その前に前回のおさらいをすると、、、


EthnaデフォルトのアクセスURLはアクション名を「page」とした場合

```
http://xx.xx.xx/?action_page=true
```

のようなイケてない感じになるのを、

```php:app/Appid_Controller.php
<?php
//…

function _getActionName_Form()
{
    if (isset($_SERVER['REQUEST_METHOD']) == false) {
        return null;
    }
        if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
        $http_vars =& $_POST;
    } else {
        $http_vars =& $_GET;
    }
 
    foreach ($http_vars as $name => $value)
    {
        if ($value == "" || strncmp($name, 'action_', 7) != 0) {
            continue;
        }
        // オリジナル方式 http://hostname/?action_action_name
        return parent::_getActionName_Form();
    }
 
    // 新かっこいい http://hostname/action/name/ 方式
    if (!empty($_SERVER['REQUEST_URI']))
    {
        $redirect_url = $_SERVER['REQUEST_URI'];
        $action_name = str_replace('/', '_', $redirect_url);
        return trim($action_name, '_');
    }
 
    // まあ悪くはない http://hostname/?action=action_name 方式
    if (array_key_exists('action', $http_vars))
    {
        return $http_vars['action'];
    }
}
```

を追記することでイイ感じのURL

```
http://xx.xx.xx/page
```

へのアクセスでページが表示されるようになります。
ここまでが前回の内容。


が、しかし…

これだとURLパラメータを渡すことができませんでした。そ、そんなあ(´Д｀)

```
http://xx.xx.xx/page?type=3
```

* Appid\[24533](ERR): Ethna_Controller._trigger_WWW(class/Ethna_Controller.php:875): undefined action [pagetype] [ERROR CODE(32)]

アクション名が[pagetype]？？？あきらかにおかしい。


再度いくつかの環境変数にvar_dumpを仕込んでアクセスしてみます。

```php:app/Appid_Controller.php
<?php
//…

var_dump($_SERVER['REDIRECT_QUERY_STRING']);
var_dump($_SERVER['QUERY_STRING']);

var_dump($_SERVER['REDIRECT_URL']);
var_dump($_SERVER['REQUEST_URI']);
```

すると

```sh:出力
string 'a=0&b' (length=5)
string 'a=0&b' (length=5)

string '/index.php' (length=10)
string '/page?a=0&b' (length=11)
```

なるほどー、[元の記事](http://rd.uniba.jp/blog/2010/06/30/ethna-%E3%81%A7%E7%B6%BA%E9%BA%97%E3%81%AA-url-ethna_urlhandler-%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95/)でREDIRECT_URLを使っていたのはパラメータがくっつかないからなのね。
しかしこのHeroku PaaS環境でRewriteを二重で行なっている我が環境では、やはりREQUEST_URIを使ってパラメータ部を分離するしかないようだ。

で、書き換えた。

```php:app/Appid_Controller.php
<?php
//…

function _getActionName_Form()
{
    if (isset($_SERVER['REQUEST_METHOD']) == false) {
        return null;
    }
        if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
        $http_vars =& $_POST;
    } else {
        $http_vars =& $_GET;
    }
 
    foreach ($http_vars as $name => $value)
    {
        if ($value == "" || strncmp($name, 'action_', 7) != 0) {
            continue;
        }
        // オリジナル方式 http://hostname/?action_action_name
        return parent::_getActionName_Form();
    }
 
    // 新新かっこいい http://hostname/action/name?a=0&b#c でもイケる方式
    if (!empty($_SERVER['REQUEST_URI']))
    {
        $redirect_url = preg_replace('/\?(.*)$/', '', $_SERVER['REQUEST_URI']);
        $action_name = str_replace('/', '_', $redirect_url);
        return trim($action_name, '_');
    }
 
    // まあ悪くはない http://hostname/?action=action_name 方式
    if (array_key_exists('action', $http_vars))
    {
        return $http_vars['action'];
    }
}
```

よしと、これでバッチリ！


enjoy! Ethna on heroku!!


<div>![M_Ishikawa](http://api.osae.me/retwipi/M_Ishikawa) [@M_Ishikawa](http://twitter.com/M_Ishikawa)</div>