2010-02-11 71 views
0

我正在提交一個正常的​​元素到當前的URL ...它是一個搜索頁面的一部分。結果網址如下。
http://domain.com/module/controller/action/get1/value1/?get2=get2&value3=value3
的問題是我使用<?= $this->url(array('page' => x)); ?>和類似導航左右,但我想保留$_GET參數...每當我使用它,它保留了/削減$_GET PARAMS和失去的?&=值對...
我想使用mod_rewrite來更改值對斜線...... 我現在的規則是..Zend_Router ... Zend_Form ... Mod_Rewrite ...重寫URL值對斜槓

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ zend.php [NC,L] 

我不自信mod_rewrite的,我不希望與現有規則相沖突。

我也很喜歡結尾的斜線,以及...所以這將是一個獎金...

請幫助!非常感謝...

PS ... Re「Zend_Router ... Zend_Form ..」的標題中。我使用Zend_Form來構建表單,並且我意識到我可以在onSubmit函數上使用javascript編寫URL ...同樣,我可以使用Zend_Router重寫url ...我認爲Mod_rewrite是最好的,但...

回答

0

我無法找到一個很好的辦法做到這一點。 ..所以我決定寫一些最小化的PHP代碼在我的zend.php的頂部。

list($sURL, $sQuery) = explode('?', $_SERVER['REQUEST_URI']); 
$sOriginalURL = $sURL; 
if ('/' !== substr($sURL, -1)) $sURL .= '/'; 
if (isset($sQuery)) { 
    foreach (explode('&', $sQuery) as $sPair) { 
     if (empty($sPair)) continue; 
     list($sKey, $sValue) = explode('=', $sPair); 
     $sURL .= $sKey . '/' . $sValue . '/'; 
    } 
} 
if (isset($sQuery) || $sOriginalURL !== $sURL) header(sprintf('Location: %s', $sURL)); 

如果有人可以改進,請在下面評論。

0

我不知道如何實現這一點,使用正則表達式和mod_rewrite的,但你可以這樣延伸Zend_Controller_Router_Route中,並用它來代替標準路由器:

<?php 
class ZendY_Controller_Router_Route_GetAware extends 
     Zend_Controller_Router_Route 
{ 
    public static function getInstance(Zend_Config $config) 
    { 
     $reqs = ($config->reqs instanceof Zend_Config) 
       ? $config->reqs->toArray() : array(); 
     $defs = ($config->defaults instanceof Zend_Config) 
       ? $config->defaults->toArray() : array(); 
     return new self($config->route, $defs, $reqs); 
    } 

    public function match($path) 
    { 
     foreach ($_GET as $k => $v) { 
      if (is_array($v)) { 
       $v = implode(',', $v); 
      } 
      $path .= "{$this->_urlDelimiter}{$k}{$this->_urlDelimiter}{$v}"; 
     } 
     parent::match($path); 
    } 
}