Backport(バックポート) #2325
完了OpenPNE.ymlのbase_url にパスが含まれない場合に、デバッグモードでwarningメッセージが表示される場合がある
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 を参照)。
Minoru Takai さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
note-4 について
#2120 #2325 は下記実装案では問題として発生しないと考えられますが,レビューおよびテストの手がかりとするため,本チケット対応後に同様のステータスに変更します.
ということなので、本チケットにコミットが紐付いていませんが、本チケットは #2324 の重複チケットと見做さず、このチケットで扱う予定だったコミットを #2324 で併せて行った(コミットに紐付くチケットを変更している状態)と見做します(※)。
※通常、修正前には、修正後に直っているはずの問題が再現できるはずですが、関連修正を併せて行なっているためこれが確認できない可能性があります。このように結果的にコミットが紐付かないチケットが生じた場合は重複チケットとして(関連チケットで duplicates - duplicated by の紐付けをした上で) Duplidated (Invalid) クローズすることがしばしばあります。
Mutsumi Imamura さんが約13年前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
動作確認OKです。