涉及HTACCESS时,GET变量会混淆

时间:2016-01-19 11:00:38

标签: php .htaccess

每当我在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");
                }
                ?>

2 个答案:

答案 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'