1

example.com/ci に codeigniter をインストールしています。サブドメイン foo.example.com があります。foo サブドメインのドキュメント ルートは、home/public_html/ci に設定されています。

.htaccess で次のルールを使用して、foo.example.com のリクエストを example.com/ci/city/foo に送信しています。

 RewriteCond %{HTTP_HOST} !^(www)\. [NC]
 RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
 RewriteRule (.*) http://example.com/ci/city/%1/$1 [L]

アドレスバーの URL が foo.example.com から example.com/ci/city/foo に変わることを除けば、すべて思いどおりに機能します。foo.example.com のままにしたいと思います。RewriteRule に R=301 はありません (以前はありましたが削除しました)。.htaccess ファイルは ci/ フォルダーにあり、ルールはすべての codeigniter のものの上にあります。

リダイレクトは完全に機能し、URL は foo.example.com のままです (Jon Lin の回答)

RewriteCond %{HTTP_HOST} !^(www)\. [NC]
 RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC]
 RewriteCond %{REQUEST_URI} !/city/
 RewriteRule (.*) /city/%1/$1 [L]

ただし、シティ コントローラーの foo メソッドの代わりに codeigniter デフォルト コントローラーが呼び出されます。

どんな助けでも大歓迎です。

4

4 に答える 4

1

走行距離はこれによって異なる場合があります (サーバーと条件に合わせて微調整する必要がある場合があります) が、私の Mac でいくつかのテストを行ったところ、次のような結果が得られました。

ディレクトリ構造

public_html/
  ci/
    application/
    system/
    .htaccess
    index.php

public_htmlルートディレクトリに他のものがあると仮定しています。そのため、.htaccess をディレクトリに残すことで、CodeIgniter 関連のものに集中させていciます。

.htaccess

DirectoryIndex index.php

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(.*)\.ciwildsub\.dev [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/city/%1/$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

自明ですが、最初のブロックはサブドメインのチェックです。私はわざわざ除外しませんでしwwwたが、あなたはそうするかもしれません (私が言ったように、あなたのマイレージは異なるかもしれません)。2 番目のブロックは、標準の CodeIgniter のindex.php削除です。

私が言ったように、ルートには書き換えによって妨げられてはならないものが含まれていると想定しているため、これらのルールはsub.example.comまたはURL にのみ適用されます。example.com/ci/

CodeIgniter 構成

$config['uri_protocol'] = 'PATH_INFO';

Apache が のような URL を処理する方法により、example.com/index.php/controller/methodをバイパスし、index.php他のディレクトリ セグメントと同様に処理します。また、mod_rewrite は必ずしもタグで停止するとは限りません[L]。その時点で .htaccess の処理を​​停止し、RewriteRule を通過してから、.htaccess を介してその URL を実行します。設定PATH_INFOにより、CodeIgniter が現在の URI を正しくプルし、.htaccess が検証ループに陥らないようにすることができます。

ただし、RewriteLog の出力に完全に満足しているわけではないことに注意してください。これをさらに最適化する方法が必要です。今日はこれ!)。ここでの説明が少し的外れでしたら申し訳ありません - 私はサーバー管理者でも mod_rewrite の専門家でもありません。より良い解決策を見つけることができれば、必ずこれを更新します。


ENDこのフラグは (ループを防ぐために) このような状況に最適なように見え[L]ますが、Apache 2.3.9+ でのみ使用できます。捜索は続く。

于 2013-04-12T09:30:41.223 に答える
0

これは私のために働いた

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /file_path/to/subdomain
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    RewriteCond %{REQUEST_URI} ^application.*
        RewriteRule ^(.*)$ /index.php?/$1 [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php?/$1 [L]
    </IfModule>

    <IfModule !mod_rewrite.c>
        ErrorDocument 404 /index.php
    </IfModule> 
于 2014-06-04T14:45:15.283 に答える