プロジェクト

全般

プロフィール

Bug(バグ) #1565

管理画面のSNS設定にアクセスできない(特定のモジュールのページにアクセスできない)

Minoru Takai13年以上前に追加. 8年以上前に更新.

ステータス:
Fixed(完了)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2010-09-07
期日:
進捗率:

100%

3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

説明

概要

一般的に、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

再現手順

  1. OpenPNEを普通に設置し、http://example.com/sns/ などからアクセスできるように設定する。
    1. 任意の場所にインストールした後で、ln -s /home/NAME/snspath/web /home/NAME/www/public_html/sns のようなシンボリックリンクを作る
    2. .htaccess の RewriteBase を /sns に設定する
  2. http://example.com/sns/pc_backend.php にアクセスしてログインする
  3. SNS設定の項目へアクセスする
    • この不具合により、管理画面のSNS設定にアクセスできない

この問題はブログ記事で扱われている通り 3.0 時点から生じており、現在最新の master(3.7) でも生じている。


関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #1579: 管理画面のSNS設定にアクセスできない(特定のモジュールのページにアクセスできない) Fixed(完了) 2010-09-07
関連している OpenPNE 3 - Backport(バックポート) #2612: 管理画面のSNS設定にアクセスできない(特定のモジュールのページにアクセスできない) Fixed(完了) 2010-09-07
関連している OpenPNE 3 - Bug(バグ) #2780: #2316 「update symfony to 1.4.13 (同梱のsymfonyのバージョンを1.4.13へ上げる)」により一部修正が巻き戻ってしまっている. Fixed(完了) 2012-02-07

関係しているリビジョン

リビジョン f30b0622 (差分)
Kousuke Ebihara13年以上前に追加

patched to symfony for avoding http://trac.symfony-project.org/ticket/9061 problem (fixes #1565)

リビジョン 3704508a (差分)
Kousuke Ebihara13年以上前に追加

patched to symfony for avoding http://trac.symfony-project.org/ticket/9061 problem (fixes #1565)

リビジョン 10a1e4f1 (差分)
Kousuke Ebihara13年以上前に追加

changed this to use a return value of sfWebRequest::getPathInfoArray() instead of the $_SERVER, and changed not to execute sfWebRequest::getRelativeUrlRoot() under Apache (fixes #1565)

履歴

#1 Kousuke Ebihara13年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更
  • 3.6 で発生するかYes にセット

#2 Masato Nagasawa13年以上前に更新

  • 担当者Masato Nagasawa にセット

#3 Masato Nagasawa13年以上前に更新

置換している処理自体を削除すれば問題は起こらないと思いますが、
この処理がどういった状況で必要になるのか分からないので削除する事によって特定の環境で不具合が出るかもしれません。

396       if ($relativeUrlRoot = $this->getRelativeUrlRoot())
397       {
398         $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $relativeUrlRoot).'\//', '', $pathInfo);
399       }

#4 Masato Nagasawa13年以上前に更新

  • 担当者 を削除 (Masato Nagasawa)

手放します。

#5 Kousuke Ebihara13年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Kousuke Ebihara にセット

#6 Kousuke Ebihara13年以上前に更新

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 にあてることで本問題を回避します。

#7 Kousuke Ebihara13年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 f30b06229f8dbffc3a3a663f881df3776378c67d で適用されました。

#8 Kousuke Ebihara13年以上前に更新

更新履歴 3704508a35a9fe39361cebae8e3d361d2949399d で適用されました。

#9 Rimpei Ogawa13年以上前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更
  • $isIis の代入部分では、 $_SERVER を直接使うのではなく $pathArray を使うべきです(元のコードの問題)
  • if ($relativeUrlRoot = $this->getRelativeUrlRoot() && $isIis) は順序を逆にして if ($isIis && $relativeUrlRoot = $this->getRelativeUrlRoot()) とすべきです

#10 Kousuke Ebihara13年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 10a1e4f16ae0532478db6495b2e87f9dcfee316f で適用されました。

#11 Rimpei Ogawa13年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#12 Yuma Sakata12年以上前に更新

  • ステータス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

#13 Kousuke Ebihara12年以上前に更新

64a72113b7cc6eaf39a21ac66efcfc8289354e0c の symfony のアップデートによって、 3704508a10a1e4f1 の変更が戻ってしまっています。これらの変更を再度当てれば問題は解決しますが、アップデート方法や独自パッチの管理方法を検討するべきだと思います。

#14 Kousuke Ebihara約12年前に更新

  • ステータスRejected(差し戻し) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更
  • 3.6 で発生するかYes から Unknown (未調査) に変更
  • 3.4 で発生するかUnknown (未調査) にセット

#2780 により、このチケットの問題に対するパッチが再度適用されました。改めて確認をお願いします。

#15 Shouta Kashiwagi約12年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

#16 kaoru n8年以上前に更新

  • 3.8 で発生するかUnknown (未調査) にセット

他の形式にエクスポート: Atom PDF