Как мне сделать так, чтобы это RewriteRule перенаправляло на нужную страницу? - PullRequest
0 голосов
/ 13 июля 2020

Прежде всего, я надеюсь, что я буду достаточно ясным, и вы сможете мне помочь.

Есть кое-что, чего я действительно не понимаю, я пытался понять это часами, но тщетно . Вот в чем дело:

Когда я набираю domainname/profile, я хочу, чтобы меня перенаправили на domainname/index.php?url=profile, но вместо этого я перенаправляюсь на domainname/index.php?url=index.php.

в моем рутере. php файл, я сделал var_dump($_GET), и он показывает 'url' => 'index.php', вот откуда я это знаю.

Вот мой корень. php:

<?php 

require_once('views/View.php');

class Router {

    private $_controller;
    private $_view;

    public function route() {
        try {
            // Load classes automatically
            spl_autoload_register(function($class) {
               require_once('models/'.$class.'.php'); 
            });

            $url = [];

            if(isset($_GET['url']) && $_GET['url'] != '') {
                $url = explode('/', filter_var($_GET['url'], FILTER_SANITIZE_URL));
                $controllerName = ucfirst(strtolower($url[0]));
                $controllerClass = "Controller".$controllerName;
                $controllerFile = 'controllers/'.$controllerClass.'.php';

                var_dump($_GET); die;

                if(file_exists($controllerFile)) {
                    require_once($controllerFile);
                    $this->_controller = new $controllerClass($url);
                } else {
                    throw new Exception('Page introuvable');
                }
            } else {
                require_once('controllers/ControllerHome.php');
                $this->_controller = new ControllerHome($url);
            }
        } catch(Exception $e) {
             $errorMsg = $e->getMessage();
             $this->_view = new View('Error');
             $this->_view->generate(['errorMsg' => $errorMsg]);
        }

    }

}

?>

Вот мой .htaccess:

RewriteEngine on

RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d

RewriteRule ^(.*)$ index.php?url=$1

Странно то, что когда я заменяю (.*) на [a-ZA-Z0-9]+, ЭТО РАБОТАЕТ, я перенаправляюсь на страницу domainname / index. php? Url = profile и мой var_dump($_GET) показывает 'url' => 'profile'.

Что не так? Я хотел использовать (.*), потому что он позволяет мне использовать несколько косых черт в моих URL-адресах, я могу "исправить" это, добавив несколько правил RewriteRules, например RewriteRule ^[a-zA-Z0-9]+/[a-zA-Z0-9]+$ index.php?url=$1, но, на мой взгляд, это странный способ заставить его работать, это не полностью динамический ...

В любом случае, надеюсь, вы поймете мою проблему. Заранее спасибо!

Кстати: я работаю на своем локальном хосте, но у меня такая же проблема на моем удаленном сервере.

1 Ответ

0 голосов
/ 13 июля 2020

Вы должны понимать, что механизм перезаписи выполняет несколько запусков, поэтому перезапускает процесс перезаписи, если запрос был перезаписан, если вы не сказали этого не делать. Это означает, что вам нужно немного изменить настройку, чтобы решить эту проблему:

RewriteEngine on
RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteCond %{REQUEST_URI} !^/index.\.php$
RewriteRule ^/?(.*)$ /index.php?url=$1 [END]

В случае, если вы получаете внутреннюю ошибку сервера (статус http 500), используя приведенное выше правило, скорее всего, вы используете очень старую версию http-сервер apache. В этом случае вы увидите явный намек на неподдерживаемый флаг [END] в файле журнала ошибок вашего http-сервера. Вы можете попробовать обновить или использовать более старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от вашей настройки.

Эта реализация будет работать аналогично на хосте http-серверов конфигурации или внутри распределенного файла конфигурации (файл ".htaccess"). Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на http-хосте. Если вы используете распределенный файл конфигурации, вам необходимо позаботиться о том, чтобы его интерпретация была вообще включена в конфигурации хоста и чтобы он находился в папке хоста DOCUMENT_ROOT.

И общее замечание: вы должны всегда предпочитаю размещать такие правила в конфигурации хоста http-серверов вместо использования файлов распределенной конфигурации (".htaccess"). Эти распределенные файлы конфигурации добавляют сложности, часто являются причиной неожиданного поведения, их трудно отлаживать, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читайте: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

...