Bug(バグ) #4055
完了OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない
100%
説明
Overview (現象)¶
OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターから日記等にアクセスする場合、http://example.com/sns/diary/1 のようなURLになるべきであるが、http://example.com/diary/1 にアクセスしてしまう。
Causes (原因)¶
通知センターに表示される通知のリンク先は、opNotificationCenter::notify()
の url
パラメーターによって指定される。
このパラメーターを実装した当初は diary/show?id=1
や @diary_show?id=1
のような url_for
ヘルパーに指定するための Internal URI の形式を想定していた。
しかし、実際には誤った実装によって Internal URI での指定は正しく機能していない状態となっていた。
(opJsonApiHelper が実行されるのは api アプリケーションであるため、url_for
ではなく app_url_for
を呼び出すのが正しい)
source:apps/api/lib/helper/opJsonApiHelper.php@8205623#L203
'url' => $notification['url'] ? url_for($notification['url'], array('abstract' => true)) : null,
通知センターによる通知機能を提供するプラグイン等では、上記の不具合を避けるために Internal URI ではなく /diary/1
などの URI を直接出力することで目的の URI へのリンクを実現している。
しかし、/diary/1
などの URI を指定した場合には、本来 url_for
や app_url_for
であれば自動的に付加されるサブディレクトリ部分の相対パス (sfWebRequest::getRelativeUrlRoot()
に相当) が付加されないため、当チケットで報告されているような OpenPNE をサブディレクトリに設置した場合のリンクの不具合が生じる。
Way to fix (修正内容)¶
JSON API の /api.php/push/search.json
の実装を修正し、opNotificationCenter::notify()
の url
パラメーターに Internal URI が指定された場合でも正しく動作するようにする。この場合は、API 実行時にサブディレクトリを考慮した URI が生成されるものとする。
また、/diary/1
のような URI を直接 url
パラメーターに指定していたプラグイン等との互換性を保つため、先頭が /
から始まる URI であった場合には app_url_for
ヘルパーを介さずに直接文字列を出力するように対応する。
この場合は、API 側ではサブディレクトリ部分の付加は行わずに出力する。これは、opLikePlugin のようにプラグイン側で独自にサブディレクトリ部分を付加した URI を url
パラメーターに指定している実装が存在しており、一律な対応を執ることが困難なためである。