.htaccess QSA标志被$ _GET覆盖

时间:2012-05-25 09:46:47

标签: php .htaccess

这是我的重写规则

RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]

当我去这个网址时

http://localhost/ub/ab?uri=cd

$_GET['uri']返回cd,而不是ab

如何让$_GET['uri']返回ab?或者这是QSA的真实行为?

感谢,

修改

.htaccess文件位于ub目录中,ab目录永远不存在。

3 个答案:

答案 0 :(得分:2)

不要使用$ _GET来检索uri参数 - .htaccess规则不会覆盖呈现给脚本的URI,因此您可以通过解析$_SERVER['REQUEST_URI']来检索URI的“ab”部分

我见过几个PHP应用程序 - 比如Joomla!和Magento - 其.htaccess文件只是将所有内容重定向到“index.php”,并将其留给PHP路由代码将URI转换为要显示的页面。

答案 1 :(得分:0)

在您的情况下$_GET['uri']由于cd而真的是?uri=cdab是网址的一部分,而不是GET查询的一部分。

我认为这是因为您在uri=和您访问的地址(RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L])中定义了http://localhost/ub/ab?uri=cd GET查询参数。它被第二个覆盖了。

查找

  1. 您可以访问http://localhost/ub/ab?uri=cd(查询字符串为?uri=cd
  2. mod_rewrite将其发送到index.php,并在uri GET参数(> index.php?uri=ub/ab
  3. 中为其添加网址
  4. 然后mod_rewrite(由于QSA)追加查询字符串,因此我们得到index.php?uri=ub/ab&uri=cd
  5. 所以uri=在最终请求中放置了两次,并被第二次请求覆盖。

    只需重命名一个GET uri参数。

答案 2 :(得分:0)

让你的RewriteRule忽略/覆盖之前的查询字符串:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?uri=$1 [L]