1

所以我试图在 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

贸易.php

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

索引.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'],我发现正在发送的请求是(表明index.php在 之后没有收到东西)。/trade?stocksymbol=GOOG?

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

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

4

2 回答 2

1

您可以使用 mod_rewrite 或在index.php中执行此操作。在 php 中,您只需要检查请求是否直接针对/index.php?page=trade,如果是,则外部重定向。这将取决于您的代码以及您想要实现它的位置,但是您可以将它放在casefor的一个地方'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]
于 2013-07-10T03:58:03.887 回答
0

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

我所要做的就是改变

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

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

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

为红鲱鱼向 John Lin 道歉——事实证明这是我的知识差距,而不是更神秘的东西。感谢您的帮助。

于 2013-07-11T01:56:21.213 回答