【问题标题】:mod_rewrite and GET value + MVCmod_rewrite 和 GET 值 + MVC
【发布时间】:2013-07-07 21:04:01
【问题描述】:

所以我尝试在 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 上。我想让表单提交并最终在 trade/GOOG - 但由于它是一个 GET 表单,而是转到 trade/trade?stocksymbol=GOOG

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没有收到@之后的内容987654329@)。

另外,打开Chrome中的开发者工具我可以看到每次确实有一个GET请求,但是if (isset($_GET['stocksymbol']))不管是在index.php还是中都是假的trade.php.

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

【问题讨论】:

    标签: php .htaccess mod-rewrite get


    【解决方案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 方式是同一类事情。您正在检查是否为 /index.php?page=trade 发出了实际请求(在这种情况下不是 URI,因为重写引擎会更改),然后重定向浏览器:

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

    【讨论】:

    • 非常感谢您的详细解答!我仍在尝试使这两种方法都起作用。当我手动输入 /trade/GOOG 时,添加 mod_rewrite 行将我带到一个重定向循环,如果我按正常方式按提交没有任何变化。然而,我刚刚意识到,虽然测试 if (isset($_GET['stocksymbol']))index.php 甚至在 trade.php 上都返回 false!那意味着什么?在 Chrome 中查看它,我可以清楚地看到那里有一个 GET 请求......
    • 我还检查了 index.php 中的 $_SERVER['REQUEST_URI'] 是什么,它是 /trade?stocksymbol=GOOG,所以我猜这意味着它事先正在执行 mod_rewrite。
    【解决方案2】:

    找了几个小时终于找到了答案,而且比我想象的要简单得多……

    我要做的就是改变

    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

    为红鲱鱼向 John Lin 道歉 - 原来这是我的知识差距,而不是更神秘的东西。感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2010-12-12
      • 2013-10-05
      • 2014-01-08
      • 2012-01-03
      • 2014-01-13
      • 1970-01-01
      • 2017-04-08
      • 2012-02-20
      相关资源
      最近更新 更多