mod_rewrite和GET值+ MVC

时间:2013-07-10 03:41:33

标签: php .htaccess mod-rewrite get

所以我试图在GET表单生成的URL上使用mod_rewrite来重定向它:

index.php?page=trade&stocksymbol=GOOG

到此:

trade/GOOG

我的.htaccess中已有此行(Multiviews已关闭):

RewriteRule ^trade$ index.php?page=trade [L]    
RewriteRule ^trade/(.*)$ index.php?page=trade&stocksymbol=$1 [L]

如果我在地址栏中手动输入 trade / GOOG / ,它的效果会很好。

问题是我正在使用MVC模型,其中控制器 index.php 呈现标题+页脚以及视图 trade.php ,以及表单本身是 trade.php 。我想让表格提交并以#strong> trade / GOOG 结束 - 但由于它是GET形式,而是转到交易/交易?stocksymbol = GOOG 。 / p>

trade.php

<form action="trade" method="get">
    <input type="text" name="stocksymbol" size="10" />
    <input type="submit" value="Search" />
</form>

的index.php

if (isset($_GET['page']))
    $page = htmlspecialchars($_GET['page']);
else
    $page = 'index';

switch ($page)
{
    case 'trade':
        if (isset($_GET['stocksymbol']))
        {
            $stocksymbol = htmlspecialchars($_GET['stocksymbol']);
        }
        render('templates/header', array('title' => 'Trade')); //render() is a function that extracts the array elements into variables and spits out the HTML
        render('trade', array('page' => $page, 'stocksymbol' => $stocksymbol));
        render('templates/footer');
        break;
    ...

我知道我在这里犯了一些菜鸟错误,因为我不太了解mod_rewrite并且逻辑有问题但是我还不能指责它。如果可能的话,为了保持简单,我想仅使用mod_rewrite而不是Javascript解决方案解决这个问题,因为我想知道mod_rewrite是否可行。

修改

原来我的GET请求没有通过。通过查看 index.php 中的$_SERVER['REQUEST_URI'],我发现发送的请求是/trade?stocksymbol=GOOG(表明 index.php 没有收到?之后的东西。

此外,启用Chrome中的开发者工具我可以看到每次确实存在GET请求,但if (isset($_GET['stocksymbol']))无效,无论它是否在 index.php trade.php

所以我认为mod_rewrite搞砸了我的GET请求。

2 个答案:

答案 0 :(得分:1)

您可以使用mod_rewrite或 index.php 执行此操作。在php中,您只需要检查请求是否直接针对/index.php?page=trade,如果是,则进行外部重定向。它将取决于您的代码以及您希望实现的位置,但您可以将其放在case 'trade'中的一个位置:

case 'trade':
    if (isset($_GET['stocksymbol']))
    {
        $stocksymbol = htmlspecialchars($_GET['stocksymbol']);

        // stuff here to redirect browser
        $self_uri = "/index.php?page=trade";
        if (strncmp($_SERVER['REQUEST_URI'], $self_uri, strlen($self_uri)))
        {
            // if the requested URI starts with /index.php?page=trade, redirect
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: /trade/' . $stocksymbol);
            exit();
        }
        // end browser redirect
    }
    render('templates/header', array('title' => 'Trade')); //render() is a function that extracts the array elements into variables and spits out the HTML
    render('trade', array('page' => $page, 'stocksymbol' => $stocksymbol));
    render('templates/footer');
    break;
...

这样做的mod_rewrite方式也是同样的事情。您正在检查实际请求(不是这种情况下的URI,因为重写引擎更改了)是为/index.php?page=trade,然后重定向浏览器:

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /index\.php\?page=trade&stocksymbol=([^&\ ]+)
RewriteRule ^ /trade/%2? [L,R=301]

答案 1 :(得分:0)

在打了几个小时之后,我终于找到了答案,这比我想象的要简单得多......

我所要做的就是改变

RewriteRule ^trade$ index.php?page=trade [L]

RewriteRule ^trade$ index.php?page=trade [qsappend]

这是我找到解释的地方: http://help.sap.com/saphelp_nwpi711/helpdata/en/48/9266f7aa6b17cee10000000a421937/content.htm

向约翰林林致歉的红鲱鱼 - 结果证明这是我所知的差距而不是更神秘的东西。谢谢你的帮忙。