Backport(バックポート) #2324
完了There are wrong URL generating for op_base_url with path name (パス名付きの op_base_url に対して誤った URL 生成をしている箇所がある)
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 を生成するように修正した。
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です。