1

这是我的重写规则

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

当我访问此网址时

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

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

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

谢谢,

编辑

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

4

3 回答 3

2

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

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

于 2012-05-25T10:00:16.083 回答
0

让您的 RewriteRule 像这样忽略/覆盖先前的查询字符串:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?uri=$1 [L]
于 2012-05-25T10:06:26.237 回答
0

在您的情况下$_GET['uri'],确实是cd由于?uri=cd. ab是 URL 的一部分,而不是 GET 查询的一部分。

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

看:

  1. 您访问http://localhost/ub/ab?uri=cd(查询字符串是?uri=cd
  2. mod_rewrite 将其发送到index.php并在uriGET 参数 ( > index.php?uri=ub/ab)中附加 URL
  3. 然后 mod_rewrite (due to QSA) 追加查询字符串,所以我们得到index.php?uri=ub/ab&uri=cd

因此uri=在最终请求中放置了两次,并被第二次覆盖。

只需重命名您的 GETuri参数之一。

于 2012-05-25T10:00:34.393 回答