操作
Backport(バックポート) #2325
完了OpenPNE.ymlのbase_url にパスが含まれない場合に、デバッグモードでwarningメッセージが表示される場合がある
開始日:
2010-09-10
期日:
2011-10-06
進捗率:
100%
予定工数:
説明
症状¶
OpenPNE.yml の base_url に、 http://sns.example.com と末尾にスラッシュをつけずに設定した場合、デバッグモード実行していると warning が表示される箇所があります。より厳密には、末尾にスラッシュがない場合ではなく、URLにパスが含まれない場合です。
再現する箇所の例¶
- http://sns.example.com/pc_backend_dev.php
- メール通知(app_url_for()が含まれているもの)
環境¶
- PHP 5.3.2 on Windows(XAMPP)
- PHP 5.3.2 on Ubuntu 10.04
原因¶
opApplicationConfiguration::getAppRouting() 内で parse_url($url) の結果 $parts を使っている箇所があり、そこで $parts['path'] が定義されているかを確認せずに参照している。
http://sns.example.com のようなパスが含まれないURLの場合、 parse_url() が返す連想配列に path というキーは含まれない。
修正内容¶
- lib/config/opApplicationConfiguration.class.php getAppRouting() メソッド内
586- $url = sfConfig::get('op_base_url'); 587- if ('http://example.com' !== $url) 588- { 589- $parts = parse_url($url); 590- $options['context'] = array( 591- 'prefix' => $this->getAppScriptName($application, sfConfig::get('sf_environment'), $parts['path'], $isNoScriptName), 592- 'host' => $parts['host'], 593- ); 594- }
591 行目で $parts['path'] が存在する前提として参照しているため、この直前で $parts['path'] を明示的に定義する(存在しなければデフォルト値を与える)。
ここで与えるべきデフォルト値は null か空文字列がよいと思われるが、より適切な値があればそれを与える。
補足¶
$parts['path'] のデフォルト値については #1577:note-9 - #1577:note-10 の考察を以て「空文字列」とすることにした。
また、このチケットでは問題とされていないが、 $parts['host'] の値についても定義されていない場合を考慮するようにした。
更に、このチケットでの修正に併せて #1577:note-18 で言及されている問題も解消した(内容は #1577:note-16 を参照)。
操作