每当我在url中添加一个额外的$_GET[]
变量然后用HTACCESS重写它时,PHP似乎感到困惑,并将1个变量(在本例中为$ r)分配给url字符串的其余部分
例如: mydomain.com/index/r/policy/cookiepolicy
如果我在index.php中echo $r
,我会得到policy/cookiepolicy
,它应该只是policy
。它不会加载policy.php页面,而是恢复为默认情况(因为它包含两个GET
变量,无法找到正确的匹配项)并将我带回主页。但是,如果我使用像这样的“丑陋”URL:mydomain.com/index.php?r=policy&tab=cookiepolicy
,一切似乎都可以正常工作
htaccess的
RewriteRule ^index/r/(.*)$ /index.php?r=$1
RewriteRule ^index/r/(.*)/(.*)$ /index.php?r=$1&tab=$2
policy.php
$k = $_GET["tab"];
//I'm loading the tabs using if() statements
if($k == "cookiepolicy"){
...
}
index.php
<?php
$r = $_GET["r"];
if (isset($r) && !empty($r)) {
switch ($r) {
//...(more cases here)
//Why do the tabs not load for the policy page?
case "policy";
include("pages/policy.php");
break;
//...(more cases here)
default:
include("pages/home.php");
break;
}
} else {
include("pages/home.php");
}
?>
答案 0 :(得分:1)
你的规则如下:
RewriteRule ^index/r/([^/]+)/([^/]+)/?$ index.php?r=$1&tab=$2 [L,QSA]
RewriteRule ^index/r/([^/]+)/?$ index.php?r=$1 [L,QSA]
答案 1 :(得分:1)
问题在于,使用重写规则,列表中的第一个是:
RewriteRule ^index/r/(.*)$ /index.php?r=$1
因为匹配/
字符$_GET['r']
正在为其分配值policy/cookiepolicy
。
您可以使用/
代替([^/]*)
从匹配中排除(.*)
,或者只是颠倒规则的顺序,以便在第一个匹配之前评估第二个匹配:< / p>
RewriteRule ^index/r/(.*)/(.*)$ /index.php?r=$1&tab=$2 [L]
RewriteRule ^index/r/(.*)$ /index.php?r=$1 [L]
那样/policy/cookiepolicy
被第一场比赛抓住了:
$_GET['r'] = 'policy'
$_GET['tab'] = 'cookiepolicy'