【问题标题】:can not add other get variable in php mvc无法在 php mvc 中添加其他 get 变量
【发布时间】:2024-01-21 05:12:01
【问题描述】:

我正在使用这个 .htaccess 代码

    RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

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

这是我的 PHP

$url = isset($_GET['url']) ? $_GET['url'] : null;
            $url = rtrim($url, '/');
            $url = explode('/', $url);
            if(empty($url[0])){

等等

现在我需要在 htaccess 中添加新的 GET 变量 我试过这个:

RewriteRule ^(.+)$ index.php?url=$1&lang=$2 [QSA,L]

但什么也没发生,因为我不明白如何检查 $_GET['lang'] 变量 当它可能存在或不存在时。 $_GET['url'] 变量也可以是字符串,例如 categories,companynane,employee 或者它可能只是categoriescategories,companyname 或者可能是NULL

我不明白如何从链接中检查这个 lang 变量,如下所示: http://mydomain.com/categories/companynane/employee/en

这是我更新的课程。

<?php
    class Bootstrap {    
        public function __construct(){
            $url = isset($_GET['url']) ? $_GET['url'] : null;
            $url = rtrim($url, '/');
            $url = explode('/', $url);
            if(empty($url[0])){
                require Controllers.'main.php';
                $controller = new main();
                $controller->Index();
                return false;
            }
            $file = Controllers.$url[0].'.php';
            if(file_exists($file)){
                require $file;
            }else{
                $this->error();
            }
            $controller = new $url[0];
            $controller->loadmodel($url[0]);
            if(isset($url[3])){
                $_SESSION['lang'] = $url[3];
                if(method_exists($controller, $url[1])){
                    $controller->{$url[1]}($url[2]);
                }else{
                    $this->error();
                }
            }else{
                if(isset($url[2])){
                    $testinglang = $this->_new->checklang($url[2]);
                    if($testinglang == true){
                        $_SESSION['lang'] = $url[2];
                        if(method_exists($controller, $url[1])){
                            $controller->{$url[1]}();
                        }else{
                            $this->error();
                        }
                    }else{
                        if(method_exists($controller, $url[1])){
                            $controller->{$url[1]}($url[2]);
                        }else{
                            $this->error();
                        }
                    }
                }else{
                    if(isset($url[1])){
                        $testinglang = $this->_new->checklang($url[1]);
                        if($testinglang == true){
                            $_SESSION['lang'] = $url[1];
                            $controller->Index();
                        }else{
                            if(method_exists($controller, $url[1])){
                                $controller->{$url[1]}();
                            }else{
                                $this->error();
                            }
                        }
                    }else{
                        $controller->Index();
                    }
                }
            }
        }
        function error(){
            require Controllers.'error.php';
            $controller = new error();
            $controller->Index();
            return false;
        }

    } 

我认为除了 $url[0] 之外的一切都很好。 如果 $url[0] 存在并且是语言怎么办? 或者可能是控制器 请告诉我如何检查。

【问题讨论】:

  • 如果上面的代码有效,那么试试 RewriteRule ^(.+)/(.+)/$ index.php?url=$1&lang=$2 [QSA,L]
  • 可能会起作用,但我不明白如何从 PHP 中检查此变量
  • 您可以使用 $_GET 或 $_REQUEST 获取查询字符串
  • 和你检查url的方法一样使用isset($_GET['lang'])

标签: php .htaccess url get


【解决方案1】:

为了使用 $2 你需要另一对 () 所以我猜你想要这样的东西:

RewriteRule ^(.+)/(.+)$ index.php?url=$1&lang=$2 [QSA,L]

这将匹配http://mydomain.com/categories/en

然后你可以在php中做:

$lang = isset($_GET['lang']) ? $_GET['lang'] : null;
if ($lang == 'en') {
    // do something in english
}

在我们解决了您的真正问题后,这应该会有所帮助:

让 RewriteRule 保持原样:

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

在php做代码后填写$url:

$lang = array_pop($url);

array_pop 返回数组的最后一个元素。在您的情况下,这是语言。之后它将不再在 $url 中,但无论您的 URL 看起来如何,您都有 $lang。

【讨论】:

  • 没有别的了?这很简单。哦,我m angry to my mind. thank you. Ill 试试这个,之后会写在这里。
  • 这不适用于http://mydomain.com/categories/companynane/employee/en的给定示例
  • 如果您的 url 中有多个 /,例如 mydomain.com/categories/companynane/employee/en,您可能会遇到更多问题。那么你需要一个更复杂的重写规则。这在很大程度上取决于您的 URL 是如何构建的。
  • 它不工作。我不明白我只有 2 个变量 1) url 2) url 中的 lang 我有带逗号的字符串,使用 PHP 我将其转换为数组,而在 lang 中我只有 2 个变量。 lang 不存在,它存在。我不明白该怎么办了。请帮忙
  • 我还不确定你真正想要做什么。也许您需要在问题中发布更多代码。如果您只想要上面 url 中的语言,它已经在 $url[4] 中,因为 $_GET['url'] 被 / 分割。