web-dev-qa-db-ja.com

Codeigniterサブドメインルーティング

CodeIgniterフレームワークで実行されているWebサイトでブログスクリプトを設定しようとしています。既存のウェブサイトのコードに大きなコード変更を加えずにこれを実行したいと思います。別のコントローラーを指すサブドメインを作成することが、これを行う最もクリーンな方法であると考えました。

新しいBlogコントローラーをセットアップするために行った手順は次のとおりです。

  1. サーバーのIPアドレスを指すAレコードを作成します。
  2. CodeIgniterのroutes.phpファイルに新しいルールを追加します。

これが私が思いついたものです:

switch ($_SERVER['HTTP_Host']) {
    case 'blog.notedu.mp':
        $route['default_controller'] = "blog"; 
        $route['latest'] = "blog/latest";
        break;
    default:
        $route['default_controller'] = "main";
        break;
}

これは、blog.notedu.mpblog.notedu.mp/latestが私のblogコントローラーを指しているはずです。

今ここに問題があります...

blog.notedu.mpまたはblog.notedu.mp/index.php/blog/latestにアクセスすると正常に機能しますが、blog.notedu.mp/latestにアクセスすると、何らかの理由で404ページに移動します...

私の.htaccessファイルは次のようになります(URLからindex.phpを削除するためのデフォルト):

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

そして、私のBlogコントローラーには次のコードが含まれています。

class Blog extends CI_Controller {

    public function _remap($method){
        echo "_remap function called.\n";
        echo "The method called was: ".$method;
    }

    public function index()
    {
        $this->load->helper('url');
        $this->load->helper('../../global/helpers/base');

        $this->load->view('blog');
    }

    public function latest(){
        echo "latest working";
    }

}

私はここで何を見逃しているのですか、それとも間違っているのですか?私は何日もこの問題の解決策を探していました:(

14
Joel Murphy

4日間の試行錯誤の末、ついにこの問題を修正しました。

.htaccessの問題であり、次のルールで修正されたことが判明しました。

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

この質問を読んだり答えたりしてくれたすべての人に感謝します。

4
Joel Murphy

Blog.domain.co/blog/latestにも404が表示されますか?デフォルトのコントローラーの_remap()関数を確認することもできます。 http://ellislab.com/codeigniter/user-guide/general/controllers.html#default

基本的に、CodeIgniterはURIの2番目のセグメントを使用して、コントローラー内のどの関数が呼び出されるかを決定します。 _remap()関数を使用して、この動作をオーバーライドします。

ユーザーガイドから直接、

コントローラに_remap()という名前の関数が含まれている場合、URIに含まれているものに関係なく、常に呼び出されます。これは、URIが呼び出される関数を決定する通常の動作をオーバーライドし、独自の関数ルーティングルールを定義できるようにします。

public function _remap($method)
    {
        if ($method == 'some_method')
        {
            $this->$method();
        }
        else
        {
            $this->default_method();
        }
    }

お役に立てれば。

1
nanyaks

apacheのサブドメインの構成ファイルに「AllowOverrideAll」がありますか?

それがないと「blog.notedu.mp/index.php/blog/latest」は完全に機能しますが、「blog.notedu.mp/latest」はありません

0
mameyugo