Zend_Router ... Zend_Form ... Mod_Rewrite ...将URL获取值重写为斜杠

时间:2010-02-11 18:05:41

标签: php apache zend-framework mod-rewrite

我正在向当前网址提交正常的<form method="get">元素...这是搜索页面的一部分。结果网址如下。
http://domain.com/module/controller/action/get1/value1/?get2=get2&value3=value3
问题是我正在使用<?= $this->url(array('page' => x)); ?>并且类似于导航但我想保留$_GET参数...每当我使用它时,它会保留/大幅削减$_GET参数并丢失?&=值对...
我想使用Mod_Rewrite将值对更改为斜线... 我目前的规则是......

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 在标题中重新“Zend_Router ... Zend_Form ..”我正在使用Zend_Form构建表单,我意识到我可以在onSubmit函数上使用javascript来编写URL ...同样我可以使用Zend_Router来重写URL ...我认为Mod_rewrite是最好的......

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

我找不到一个很好的方法来做到这一点...所以我决定在zend.php的顶部编写一些最小化的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));

如果有人可以改进,请在下面发表评论。