プロジェクト

全般

プロフィール

Backport(バックポート) #2324

完了

There are wrong URL generating for op_base_url with path name (パス名付きの op_base_url に対して誤った URL 生成をしている箇所がある)

Shinichi Urabe さんが13年以上前に追加. 約13年前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2010-06-08
期日:
2011-10-06
進捗率:

100%

予定工数:

説明

Overview (現象)

There are wrong URL generating for op_base_url with path name.

  • Generating URL in mobile_mail_frontend
  • Redirecting to SSL versioned (or non-SSL versioned) URL

パス名付きの op_base_url に対して誤った URL 生成をしている箇所がある。

  • mobile_mail_frontend における URL 生成
  • SSL 用 / 非 SSL 用 URLに対してのリダイレクト

Causes (原因)

The generatings didn't consider of path name in based URLs.

これらの URL 生成では、基にしている URL 中のパス名部分を考慮していなかった。

Way to fix (修正内容)

I fixed URL generation to consider of path name in URL.

URL 中のパス名部分を考慮して URL を生成するように修正した。


関連するチケット 3 (0件未完了3件完了)

関連している OpenPNE 3 - Bug(バグ) #1155: There are wrong URL generating for op_base_url with path name (パス名付きの op_base_url に対して誤った URL 生成をしている箇所がある)Fixed(完了)Kousuke Ebihara2010-06-08

操作
関連している OpenPNE 3 - Backport(バックポート) #2120: 設定ファイルを記述し忘れた場合に、招待メールに記載されたURLにアクセスできない Fixed(完了)Yuya Watanabe2011-05-192011-10-06

操作
関連している OpenPNE 3 - Backport(バックポート) #2325: OpenPNE.ymlのbase_url にパスが含まれない場合に、デバッグモードでwarningメッセージが表示される場合があるFixed(完了)Yuya Watanabe2010-09-102011-10-06

操作

Shinichi Urabe さんが約13年前に更新

  • 期日2011-10-06 にセット
  • 担当者Yuya Watanabe にセット

Yuya Watanabe さんが約13年前に更新

  • ステータスNew(新規) から Accepted(着手) に変更

#2120 #2325 は本チケットのBP元の実装により発生しうる問題のBPとなるため,本チケットのBP元となる #1155 の実装に #1577 および #1675 の実装を含めたものを本チケットの実装案として記述します.具体的には以下のようなものを検討しています.
また,BP元 #1155 ではSSLを考慮したコミットも含まれますが, 3.4 ではSSLは未対応であるため本チケットでは対応しません.

#2120 #2325 は下記実装案では問題として発生しないと考えられますが,レビューおよびテストの手がかりとするため,本チケット対応後に同様のステータスに変更します.

実装案

diff --git a/lib/config/sfOpenPNEApplicationConfiguration.class.php b/lib/config/sfOpenPNEApplicationConfiguration.class.php
index 1de6ab2..37d573a 100644
--- a/lib/config/sfOpenPNEApplicationConfiguration.class.php
+++ b/lib/config/sfOpenPNEApplicationConfiguration.class.php
@@ -19,6 +19,8 @@ abstract class sfOpenPNEApplicationConfiguration extends sfApplicationConfigurat
 {
   static protected $zendLoaded = false;

+  protected $appRoutings = array();
+
   public function initialize()
   {
     mb_internal_encoding('UTF-8');
@@ -519,4 +521,85 @@ abstract class sfOpenPNEApplicationConfiguration extends sfApplicationConfigurat

     parent::setCacheDir($newCacheDir);
   }
+
+  public function generateAppUrl($application, $parameters = array(), $absolute = false)
+  {
+    list($route, $parameters) = sfContext::getInstance()->getController()
+      ->convertUrlStringToParameters($parameters);
+
+    return $this->getAppRouting($application)->generate($route, $parameters, $absolute);
+  }
+
+  protected function getAppRouting($application)
+  {
+    if (isset($this->appRoutings[$application]))
+    {
+      return $this->appRoutings[$application];
+    }
+
+    $context = sfContext::getInstance();
+    $configuration = $context->getConfiguration();
+
+    $config = new opRoutingConfigHandler();
+    $currentApp = sfConfig::get('sf_app');
+
+    sfConfig::set('sf_app', $application);
+    $configuration->setAppDir(sfConfig::get('sf_apps_dir').DIRECTORY_SEPARATOR.$application);
+
+    $settings = sfDefineEnvironmentConfigHandler::getConfiguration($configuration->getConfigPaths('config/settings.yml'));
+    $isNoScriptName = !empty($settings['.settings']['no_script_name']);
+
+    $options = $context->getRouting()->getOptions();
+    $url = sfConfig::get('op_base_url');
+    if ('http://example.com' !== $url)
+    {
+      $parts = parse_url($url);
+
+      $parts['path'] = isset($parts['path']) ? $parts['path'] : '';
+      $options['context']['prefix'] = $this->getAppScriptName($application, sfConfig::get('sf_environment'), $parts['path'], $isNoScriptName);
+
+      if (isset($parts['host']))
+      {
+        $options['context']['host'] = $parts['host'];
+      }
+    }
+    else
+    {
+      $path = preg_replace('#/[^/]+\.php$#', '', $options['context']['prefix']);
+      $options['context']['prefix'] = $this->getAppScriptName($application, sfConfig::get('sf_environment'), $path, $isNoScriptName);
+    }
+
+    $routing = new sfPatternRouting($context->getEventDispatcher(), null, $options);
+    $routing->setRoutes($config->evaluate($configuration->getConfigPaths('config/routing.yml')));
+    $context->getEventDispatcher()->notify(new sfEvent($routing, 'routing.load_configuration'));
+
+    sfConfig::set('sf_app', $currentApp);
+    $configuration->setAppDir(sfConfig::get('sf_apps_dir').DIRECTORY_SEPARATOR.$currentApp);
+
+    $this->appRoutings[$application] = $routing;
+
+    return $this->appRoutings[$application];
+  }
+
+  protected function getAppScriptName($application, $env, $prefix, $isNoScriptName = false)
+  {
+    if ($isNoScriptName)
+    {
+      return $prefix;
+    }
+
+    if ('/' === $prefix)
+    {
+      $prefix = '';
+    }
+
+    $name = $prefix.'/'.$application;
+    if ('prod' !== $env)
+    {
+      $name .= '_'.$env;
+    }
+    $name .= '.php';
+
+    return $name;
+  }
 }
diff --git a/lib/helper/opUtilHelper.php b/lib/helper/opUtilHelper.php
index 06dc86c..6eb49a9 100644
--- a/lib/helper/opUtilHelper.php
+++ b/lib/helper/opUtilHelper.php
@@ -204,39 +204,7 @@ function _app_url_for_route($application, $routeName, $params = array(), $absolu

 function _app_url_for_internal_uri($application, $internal_uri, $absolute = false)
 {
-  // stores current states
-  $current_application = sfContext::getInstance()->getConfiguration()->getApplication();
-  $current_environment = sfContext::getInstance()->getConfiguration()->getEnvironment();
-  $current_is_debug = sfContext::getInstance()->getConfiguration()->isDebug();
-  $current_config = sfConfig::getAll();
-
-  // computes a url
-  if (sfContext::hasInstance($application))
-  {
-    $context = sfContext::getInstance($application);
-    sfContext::switchTo($application);
-  }
-  else
-  {
-    $config = ProjectConfiguration::getApplicationConfiguration($application, $current_environment, $current_is_debug);
-    $context = sfContext::createInstance($config, $application);
-  }
-  $is_strip_script_name = (bool)sfConfig::get('sf_no_script_name');
-  $result_url = $context->getController()->genUrl($internal_uri, $absolute);
-
-  // restores the previous states
-  sfContext::switchTo($current_application);
-  sfConfig::add($current_config);
-
-  // replaces a script name
-  $before_script_name = basename(sfContext::getInstance()->getRequest()->getScriptName());
-  $after_script_name = _create_script_name($application, $current_environment);
-  if ($is_strip_script_name)
-  {
-    $before_script_name = '/'.$before_script_name;
-    $after_script_name = '';
-  }
-  return str_replace($before_script_name, $after_script_name, $result_url);
+  return sfContext::getInstance()->getConfiguration()->generateAppUrl($application, $internal_uri, $absolute);
 }

 function _create_script_name($application, $environment)

wa ta さんが約13年前に更新

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

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

Minoru Takai さんが約13年前に更新

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

#2120 #2325 は本チケットのBP元の実装により発生しうる問題のBPとなるため,本チケットのBP元となる #1155 の実装に #1577 および #1675 の実装を含めたものを本チケットの実装案として記述します.具体的には以下のようなものを検討しています.

#2120, #2324, #2325 に関する修正が、本チケットの修正 624162b8 で全て取り込まれていることを確認しました。

また,BP元 #1155 ではSSLを考慮したコミットも含まれますが, 3.4 ではSSLは未対応であるため本チケットでは対応しません.

#1155 では 4 個のコミットがされており、2個目から4個目は lib/filter/opExecutionFilter.class.php に対する修正でしたが、このファイルは OpenPNE-3.5.0 で新規追加されたもの c1072092 であり 3.4.x ではその前身となるファイルも存在しないため、2個目から4個目のコミットは 3.4.x 系の対象外と判断できます。

レビューOKです。

Mutsumi Imamura さんが約13年前に更新

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

動作確認OKです。

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