所以我试图在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请求。
答案 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
向约翰林林致歉的红鲱鱼 - 结果证明这是我所知的差距而不是更神秘的东西。谢谢你的帮忙。