Bug(バグ) #1565
完了管理画面のSNS設定にアクセスできない(特定のモジュールのページにアクセスできない)
100%
説明
概要¶
一般的に、OpenPNEのメンバー側のログイン画面は
http://sns.example.com/ http://example.com/OpenPNE/
のようなURLでアクセスできるようにサーバ、OpenPNEを設定することが多いと思われる。このとき、次のようなURL
http://example.com/sns/
でメンバー側のログイン画面にアクセスできるようにした場合、sns モジュールのページにアクセスできなくなる。アクセスできなくなるのは、script_name を含むURLに限られる。※ script_name は Symfony のソースコード中で用いられている変数名で、OpenPNEでは index.php や pc_frontend.php, pc_backend.php といった部分が相当する。
具体的には、上記のように sns/ をURLに含むようにSNSを設置した場合、
http://example.com/sns/pc_backend.php/sns/config (管理画面にあるSNS設定メニューの遷移先) http://example.com/sns/pc_backend.php/sns/term (同SNS設定の「SNS内名称設定」)
上記のようなURLにアクセスすると、「このページにはアクセスできません」といったエラーになってしまう。なお、他の管理項目には問題なくアクセスできる。この問題は管理画面で用いられている sns というモジュールに限らない。例えば、
http://example.com/member/
というURLがメンバー側ログインページとなるように設定すると、携帯の場合、通常ログイン直後に「このページにはアクセスできません」と表示されてしまう(これは index.php という script_name がURLに含まれるためこの不具合によってモジュール名が正しく取得できずルーティングに失敗する)。
備考¶
- /sns/pc_backend_dev.php/sns/config にアクセスした際のエラー内容
404 | Not Found | sfError404Exception Action "config/index" does not exist. stack trace * at () in SF_ROOT_DIR/lib/vendor/symfony/lib/controller/sfController.class.php line 196 ... 193. $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Action "%s/%s" does not exist', $moduleName, $actionName)))); 194. } 195. 196. throw new sfError404Exception(sprintf('Action "%s/%s" does not exist.', $moduleName, $actionName)); 197. } 198. 199. // create an instance of the action * at sfController->forward('config', 'index') in SF_ROOT_DIR/lib/vendor/symfony/lib/controller/sfFrontWebController.class.php line 48 ... 45. } 46. 47. // make the first request 48. $this->forward($moduleName, $actionName); 49. } 50. catch (sfException $e) 51. { * at sfFrontWebController->dispatch() in SF_ROOT_DIR/lib/vendor/symfony/lib/util/sfContext.class.php line 170 ... 167. */ 168. public function dispatch() 169. { 170. $this->getController()->dispatch(); 171. } 172. 173. /** * at sfContext->dispatch() in SF_ROOT_DIR/web/pc_backend_dev.php line 14 ...
- 関連文献
- 関連ソースコード
- lib/vendor/symfony/lib/request/sfWebRequest.class.php (L266) getPathInfo() メソッド内
else { $pathInfo = $pathArray[$sf_path_info_key]; if ($relativeUrlRoot = $this->getRelativeUrlRoot()) { $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $relativeUrlRoot).'\//', '', $pathInfo); } }
- /sns/pc_backend.php/sns/config にアクセスした場合、上記の else 文中で preg_replace() が実行される直前に $relativeUrlRoot = "sns", $pathInfo = "sns/config" となっているが、 preg_replace() の実行によって $pathInfo が "config" という意図しない形に置換されてしまっているのが関係しているように思われる。
- Symfonyのソースコード http://trac.symfony-project.org/changeset/74
- lib/vendor/symfony/lib/request/sfWebRequest.class.php (L266) getPathInfo() メソッド内
再現手順¶
- OpenPNEを普通に設置し、http://example.com/sns/ などからアクセスできるように設定する。
- 任意の場所にインストールした後で、ln -s /home/NAME/snspath/web /home/NAME/www/public_html/sns のようなシンボリックリンクを作る
- .htaccess の RewriteBase を /sns に設定する
- http://example.com/sns/pc_backend.php にアクセスしてログインする
- SNS設定の項目へアクセスする
- この不具合により、管理画面のSNS設定にアクセスできない
この問題はブログ記事で扱われている通り 3.0 時点から生じており、現在最新の master(3.7) でも生じている。
Masato Nagasawa さんが約14年前に更新
置換している処理自体を削除すれば問題は起こらないと思いますが、
この処理がどういった状況で必要になるのか分からないので削除する事によって特定の環境で不具合が出るかもしれません。
396 if ($relativeUrlRoot = $this->getRelativeUrlRoot()) 397 { 398 $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $relativeUrlRoot).'\//', '', $pathInfo); 399 }
Kousuke Ebihara さんが約14年前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Kousuke Ebihara にセット
Kousuke Ebihara さんが約14年前に更新
symfony には以下でバグ報告しました。
#9061 ([PATCH] Replacing path info is wrong under Apache so it will direct user to wrong module / action) - symfony - Trac
http://trac.symfony-project.org/ticket/9061
ひとまずこのチケットに添付したパッチを sfWebRequest にあてることで本問題を回避します。
Kousuke Ebihara さんが約14年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 f30b06229f8dbffc3a3a663f881df3776378c67d で適用されました。
Rimpei Ogawa さんが約14年前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
- $isIis の代入部分では、 $_SERVER を直接使うのではなく $pathArray を使うべきです(元のコードの問題)
if ($relativeUrlRoot = $this->getRelativeUrlRoot() && $isIis)
は順序を逆にしてif ($isIis && $relativeUrlRoot = $this->getRelativeUrlRoot())
とすべきです
Kousuke Ebihara さんが約14年前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 10a1e4f16ae0532478db6495b2e87f9dcfee316f で適用されました。
Rimpei Ogawa さんが約14年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんがほぼ13年前に更新
- ステータス を Pending Testing(テスト待ち) から Rejected(差し戻し) に変更
- 進捗率 を 70 から 50 に変更
以下のようなURLに設定した場合、管理画面の該当するページにアクセスできませんでした。
アクセスできるように修正お願いします。
設定したURL¶
http://example.com/sns/ http://example.com/navigation/ http://example.com/profile/ http://example.com/plugin/
管理画面のアクセスできないページ¶
http://example.com/sns/pc_backend.php/sns/config http://example.com/navigation/pc_backend.php/navigation/list http://example.com/profile/pc_backend.php/profile/list http://example.com/plugin/pc_backend.php/plugin/list
Kousuke Ebihara さんがほぼ13年前に更新
64a72113b7cc6eaf39a21ac66efcfc8289354e0c の symfony のアップデートによって、 3704508a や 10a1e4f1 の変更が戻ってしまっています。これらの変更を再度当てれば問題は解決しますが、アップデート方法や独自パッチの管理方法を検討するべきだと思います。
Kousuke Ebihara さんがほぼ13年前に更新
- ステータス を Rejected(差し戻し) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
- 3.6 で発生するか を Yes から Unknown (未調査) に変更
- 3.4 で発生するか を Unknown (未調査) にセット
#2780 により、このチケットの問題に対するパッチが再度適用されました。改めて確認をお願いします。
Shouta Kashiwagi さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。