1

内部に存在しないように URL のダッシュを書き直そうとしています。たとえば、この URL

localhost/mysite/ about-me

「about-me」は「aboutme」に書き換える必要があります。コントローラーのクラス名はこのルート文字列に依存するため、これが必要です。これには明らかにダッシュを使用できません。

これは、私が見つけた条件とルールであり、私のニーズに合うはずです:

# Condition is to avoid rewrite on files within specified subdirs
RewriteCond $1 !^(css|img|ckeditor|scripts)
RewriteRule ^([^-]+)-([^-]+)$ $1$2 [L]

ただし、コントローラークラスAboutmeがインスタンス化されていないため、機能していないようです。代わりに404 エラーが発生しますが、名前にダッシュが含まれていない同様のコントローラー クラスには問題はありません。

これについて手を貸していただけますか?

4

4 に答える 4

4

なぜルートに行かないのですか?

$route['about-me'] = 'aboutme/index';
于 2012-12-18T10:42:53.810 に答える
1

^ と $ を削除してみてください

# Condition is to avoid rewrite on files within specified subdirs
RewriteCond $1 !^(css|img|ckeditor|scripts)
RewriteRule ([^-]+)-([^-]+) $1$2 [L]
于 2012-12-18T10:44:26.353 に答える
1

Router クラスを拡張できます。/application/core
MY_Router.phpというファイルを作成し( 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]).'.php')) {
            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]).'.php')) {
                    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.'.php')) {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

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

これにより、自動的に - が _ に書き換えられます。
アンダースコアが不要な場合は、コードを変更してアンダースコアを何も置き換えないようにします。to
のすべての出現str_replace('-', '_',str_replace('-', '',

于 2012-12-18T11:52:26.137 に答える
1

mod-rewrite でそれを行う方法は次のとおりです。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI}  ^/(.*)([\w]*)-([\w]*)(.*)/?$ [NC]
RewriteRule  .* %1%2%3%4 [L,DPI]

リダイレクトしませんがR=301、[R=301,DPI,L] のように追加できます。

である必要はありませんabout-me。任意の位置の任意の単語ペアにすることができます。すなわち

localhost/mysite/about-me=.../aboutmeまたは

localhost/mysite/folder1/folder2/folder3/my-folder=.../myfolderまたは

localhost/mysite/folder1/folder2/my-folder/folder3= .../myfolder/...

于 2012-12-18T16:23:38.510 に答える