0

これについて見つけることができるすべての htaccess スニペットを試しましたが、どれも機能しません。私の codeigniter プロジェクトは ci.mydomain.com にあり、この方法で仮想ホストを構成しました

<VirtualHost *:80>
    ServerName ci.mydomain.com
    ServerAlias ci.mydomain.com
    ServerAdmin x@gmail.com
    DocumentRoot /var/www/codeigniter
</VirtualHost>

私も設定しました

$config['index_page'] = '';

404 が表示されます。何が問題なのですか? 最新バージョンの 2.1.3 を使用しています

アップデート

<VirtualHost *:80>
    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [PT]
    ServerName ci.domain.com
    ServerAlias ci.domain.com
    ServerAdmin d@d.com
    DocumentRoot /var/www/codeigniter
</VirtualHost>

私はこれを試してみましたが、うまくいきました。私はむしろ .htaccess ファイルを使用したいと思いますが。

編集:みんな、私が仮想ホストを使用していると述べた理由は、それが問題の原因であると思われるからです。しかし、多分私は間違っています。

4

1 に答える 1

3

このための実際の主力製品は、という名前のモジュールです。このモジュールmod_rewriteを使用すると、処理のために URL を index.php にリダイレクトする書き換えルールを設定できます。

これを行う方法の詳細については、この記事を参照してください

アップデート:

使用している書き換え条件は、古いルールに従っているようです。

あなたが見逃していると思う2つのこと(そのうちの1つは関係ありませんが、役に立ちます)は次のとおりです。

  1. RewriteBase- 書き換えベースを指定すると、ルールがより適切に機能するようになることがわかりました。技術的には、なくても機能するはずですが、それがなくても問題に遭遇しただけです。
  2. RewriteCond実際のファイルを除外するためのステートメント - 現在、あなたの条件は多くの実際のファイルをマスクしていますが、これはおそらくあなたが望むものではありません.

では、これを修正するにはどうすればよいでしょうか。

RewriteBase /

これにより、書き換えエンジンのルートが.com/this の後に開始するように設定されます。これにより、先頭の / を処理する必要がないため、作業が簡素化されます。

その結果、メインの書き換えルールを次のように変更する必要があります。

RewriteRule ^(.*)$ index.php/$1 [L]

これはにリダイレクトさ.com/anything/you/type.com/index.php/anything/you/type、php スクリプトはそれを自動的に取得してルーターに渡すことができます。

ただし、これは条件に依存します。そうしないとループに陥ってしまうため、この行の上に、実際のファイル/フォルダーが非表示にならないようにこれらの条件が必要です。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

これ!-fは「Not -f」を意味します。ここで、-f は「Is A File」を意味し、-d も「Is a Directory」を意味するため、基本的には%{REQUEST_FILENAME}、ファイルでもディレクトリでもない場合にのみ、このルールに一致すると言っています。 .

次に、実際のファイルを指す URL は問題なく解決されます。(index.php を含む)。

したがって、.htaccess に次の行を追加すると、適切に書き換えられるはずです。

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

Apache の設定で mod_rewrite が有効になっていれば、問題ありません。

Ubuntu で Apache2 を使用している場合、これを有効にするコマンドは簡単です。

a2enmod rewrite
service apache2 reload

モジュールが実際に有効になっていRewrite*て、Apache のすべてのルールが実行されないことが重要です。

それでも問題が解決しない場合は、apache のメイン構成を調べて、.htaccess ファイルで許可されているコマンドのサブセットがあるかどうかを確認する必要があります。通常、インストールは、Allそこに何でも指定できるように設定されていますが、多くの場合、ロックされています。顧客間のセキュリティの重複を防ぐため。VPS を使用しているとのことでしたので、おそらくこの手順を実行する必要はありませんが、他の人のために言及したいと思います。

探しているオプションは次のようになります。

AllowOverride All 

主に安全ネットである最後のものが1つあります。

Apache は、既存のモジュールに対して節を保護する方法を提供します

<IfModule mod_rewrite.c>  
   ~~ Put Rewrite* Rules here ~~
</IfModule>

更新 2

わかりました、仮想ホストに気付きました。問題は、書き換え条件をブロックに入れていることであり、それらはファイルが入っているフォルダー<VirtualHost >のブロックに存在する必要があると思います.<Directory>

これを行うには、conf からすべてのRewrite*ルールを削除し、これを .conf ファイルに追加します。

<Directory /var/www/codeigniter>
   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ index.php/$1 [L]
</Directory>

または、この中に.htaccessファイルを追加します。/var/www/codeigniter

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

これらの規則は VHost 宣言ではなくディレクトリに適用され、.htaccess は<Directory>基本的にブロックへのショートカットです。

便利なリンク:

于 2012-10-19T17:51:58.107 に答える