URL重写$ _GET

时间:2014-06-17 15:40:57

标签: php mod-rewrite

我制作了自己的MVC应用程序。我在.htaccess中使用了以下RewriteRule:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ index.php?p=$1

然后我去这个网址:

http://localhost/myapp/dahsboard/index

我得到变量$_GET['p']=dahsboard/index&它有效。

但是我使用jQueryUI中的AutoComplete和Ajax,并使用AutoComplete使用的输入值发送变量$_GET['term']

我的网址是:

http://localhost/myapp/dashboard/index?term='myvalue'

我的.htaccess无法解决问题而且我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

要合并新旧查询字符串,请使用[QSA]标记。

RewriteEngine on
RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ index.php?p=$1 [QSA]

答案 1 :(得分:0)

易。从这个改变你的RewriteRule:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ index.php?p=$1

对此:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ index.php?p=$1 [L,QSA]

使用QSA flag将查询字符串转移到重写的目的地。

所以当你转到这个网址时:

http://localhost/myapp/dahsboard/index?term='myvalue'

它会像这样传递:

http://localhost/myapp/dahsboard/index.php?p=index&term=myvalue

如果我将以下内容放在index.php

<?php

echo '<pre>';
print_r($_GET);
echo '</pre>';

?>

返回的输出是:

Array
(
    [p] => index
    [term] => 'myvalue'
)

此外,如果您想轻松调试结果,除RL之外,您还可以使用QSA标记。 RewriteEngine on RewriteRule ^([a-zA-Z0-9\-\_\/]*)$ index.php?p=$1 [L,R,QSA] 喜欢这样:

curl -I

然后运行Location:检查Apache标头,它应该告诉您它将通过curl -I http://localhost:8888/myapp/dahsboard/index?term='myvalue' HTTP/1.1 302 Found Date: Tue, 17 Jun 2014 16:07:29 GMT Server: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8r DAV/2 PHP/5.4.10 Location: http://localhost:8888/Applications/MAMP/htdocs/myapp/dahsboard/index.php?p=index&term=myvalue Content-Type: text/html; charset=iso-8859-1 标头发送到哪里:

R

现在是的,/Applications/MAMP/htdocs/标志将index.php?p=index&term=myvalue的额外路径信息添加到URL我不是100%清楚为什么会发生这种情况。但是对于像这样的基本调试,你可以很好地阅读标题,看看是否发送了R的最终目的地。一旦您知道这一点,请在将这些规则投入生产时删除http://localhost:8888/Applications/MAMP/标志。

FWIW,{{1}}反映了我在Mac OS X中的本地MAMP设置。所以请忽略它。您的本地设置很可能会返回100%不同的信息。但基本概念是可靠的。