这是我的重写规则
RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
当我访问此网址时
http://localhost/ub/ab?uri=cd
$_GET['uri']
返回cd
,而不是ab
。
如何获得$_GET['uri']
回报ab
?或者这是 QSA 的真实行为?
谢谢,
编辑
.htaccess
文件在目录ub
中,ab
目录永远不存在。
不要使用 $_GET 来检索 uri 参数 - .htaccess 规则不会覆盖呈现给脚本的 URI,因此您可以通过解析来检索 URI 的“ab”部分$_SERVER['REQUEST_URI']
。
我见过几个 PHP 应用程序——比如 Joomla!和 Magento - 其 .htaccess 文件只是将所有内容重定向到“index.php”,并将其留给 PHP 路由代码以将 URI 转换为要显示的页面。
让您的 RewriteRule 像这样忽略/覆盖先前的查询字符串:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?uri=$1 [L]
在您的情况下$_GET['uri']
,确实是cd
由于?uri=cd
. ab
是 URL 的一部分,而不是 GET 查询的一部分。
我认为发生这种情况是因为您已经在您访问的地址()和地址uri=
中定义了 GET 查询参数。它被第二个覆盖。RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
http://localhost/ub/ab?uri=cd
看:
http://localhost/ub/ab?uri=cd
(查询字符串是?uri=cd
)index.php
并在uri
GET 参数 ( > index.php?uri=ub/ab
)中附加 URLQSA
) 追加查询字符串,所以我们得到index.php?uri=ub/ab&uri=cd
因此uri=
在最终请求中放置了两次,并被第二次覆盖。
只需重命名您的 GETuri
参数之一。