这是我的重写规则
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并在uriGET 参数 ( > index.php?uri=ub/ab)中附加 URLQSA) 追加查询字符串,所以我们得到index.php?uri=ub/ab&uri=cd 因此uri=在最终请求中放置了两次,并被第二次覆盖。
只需重命名您的 GETuri参数之一。