Ссылка с "-" в URL с использованием codeIgniter - PullRequest
0 голосов
/ 21 ноября 2011

Я использую Codeigniter (впервые).Я хочу, чтобы URL-адрес страницы "веб-дизайн", чтобы он мог быть доступен как / веб-дизайн.Я знаю, что невозможно создать имя класса с помощью «-», поэтому я попытался сделать это с помощью .htaccess, например:

RewriteEngine on

RewriteRule ^web-design$ index.php/webdesign [L]

RewriteCond $1 !^(index\.php|images|robots\.txt|assets)
RewriteRule ^(.*)$ index.php/$1 

, но это не работает.Это дает мне ошибку 404.Как я могу заставить это работать?Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Я использую расширенный класс Router, который преобразует любой URL с дефисами в подчеркивание.

Например, www.mysite / web-design будет перенаправлено на * web_design * или www.mysite / home / что угодно, а 2 будет перенаправлено на home контроллер и запустите метод / функцию * what_you_want *, передав в качестве параметра 2 .

Если вы используете Codeigniter 2, поместите это в / application / core (и я уверен, что префикс MY_ в вашей конфигурации.

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Router extends CI_Router {

    function set_class($class) {
        $this->class = str_replace('-', '_', $class);
    }

    function set_method($method) {
        $this->method = str_replace('-', '_', $method);
    }

    function _validate_request($segments) {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT)) {
            return $segments;
        }
        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0])) {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0) {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT)) {
                    show_404($this->fetch_directory().$segments[0]);
                }
            } else {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        // Can't find the requested controller...
        show_404($segments[0]);
    }
}

Обратите внимание; это не мой код, но я не могу вспомнить, где я его нашел, так что, если он ваш, - слава!

2 голосов
/ 21 ноября 2011

Вы должны использовать маршрутизацию в CI! Вот почему они сделали это.

Это на самом деле довольно просто.

В application/config/routes .php добавьте следующее в массив $ route:

$route['web-design'] = "webdesign";
$route['web-design/(:any)'] = "webdesign/$1";

Затем вы можете создать контроллер с именем Webdesign; Проблема решена - правильный путь. Не нужно ничего расширять или создавать другие правила перезаписи.

1 голос
/ 21 ноября 2011

- - это специальный символ в регулярном выражении. Попробуйте убежать, вот так:
RewriteRule ^web\-design$ index.php/webdesign [L]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...