3

本番環境と開発環境で異なるポート番号を保持したいのですが、zend ルートに基づく URL ヘルパーの呼び出しでポート番号が忘れられてしまいます。

私のルートは、主にマルチドメイン構成での多言語用に、デフォルトのホスト名ルートでチェーン化された一連の正規表現ルートです (以下に簡単な概要を示します)。

<?php
    $routecateg = new Zend_Controller_Router_Route_Regex('cat/(\w+)_([^_]+)(?:_page_(\d+))?(?:_par_(\d+))?(?:.html)?',
    array(1 =>'',2=>'',3=>'1',4=>'20','controller' =>'list','action'=>'categ'),
    array(1 =>'categid',2=>'categname',3=>'page',4=>'par'),
    'cat/%s_%s_page_%d_par_%d.html'
);

$routeindex= new Zend_Controller_Router_Route_Regex('(index|home)?',
    array('controller' =>'index','action'=>'home'),
    array(),
    'index'
);    

$hostRouteRepository = new Zend_Controller_Router_Route_Hostname(
    ':lang.'.$config->serverurl
);
$router ->addRoute('index',$hostRouteRepository->chain($routeindex));
$router ->addRoute('categ',$hostRouteRepository->chain($routecateg));
?>

$config->serverurl は、環境に応じて単なるドメイン名であり、application.ini ファイルで構成されています。

私の運用サーバーでは、デフォルトのポート 80 で実行しているので問題ありませんが、developmenet では別のポートで実行する必要があり、URL ヘルパーを呼び出すたびにポート番号が忘れられます。

Apache サーバーをより適切に構成することで回避できることはわかっていますが、この問題の解決策が見つからないことに驚いています。

4

1 に答える 1

2

これが私が見つけたものです:

':lang.example.com:8888'や':lang.example.com:port'のようなものをZend_Controller_Router_Route_Hostnameのコンストラクターに渡すと、ポート部分が正しく解析されません(com:8888またはcom:port) 。これは、文字列が「。」で展開されるためです。文字であり、hostVariable文字(':')は、構成内の展開されたパーツの最初の文字でのみチェックされます。

foreach (explode('.', $route) as $pos => $part) {
            if (substr($part, 0, 1) == $this->_hostVariable) {
                $name = substr($part, 1);
                $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name]
                                       : $this->_defaultRegex);
                $this->_variables[$pos] = $name;
            } else {
                $this->_parts[$pos] = $part;
                $this->_staticCount++;
            }
        }

現在、ルートマッチング関数(function match($ request))では、ポート番号がリクエストから破棄され、有効なリクエストがルートに一致するのを防ぎます。

// Get the host and remove unnecessary port information
    $host = $request->getHttpHost();
    if (preg_match('#:\d+$#', $host, $result) === 1) {
        $host = substr($host, 0, -strlen($result[0]));
    }

私はあなたの問題を解決するために3つの異なる方法があると信じています:

  1. config.iniファイルにポート番号オプションを追加し、次のようにZend_Registryに登録します。 Zend_Registry::set('PORT_NUMBER', $this->getOption('portnumber'));
  2. 関数match($ request)のコードを修正して、ポート番号を保持します(上記のコードをコメントアウトすると、それが可能になります)
  3. ルートの「:port」パラメーター化を可能にするようにコンストラクターのコードを修正します(ルートを設定するときに必須値またはデフォルト値を使用することをお勧めします)

注:ソリューション2は3よりも簡単に見えますが、ポート番号はアセンブル関数によってurlencodedされるため、追加の作業が必要です。

foreach (array_reverse($host, true) as $key => $value) {
        if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key]) || $partial) {
            if ($encode) $value = urlencode($value);
            $return = '.' . $value . $return;

            $flag = true;
        }
    }

ポート番号は可変であるため、これはソリューション3では発生しないはずです。

お役に立てば幸いです。

于 2010-02-12T02:37:13.700 に答える