2011-06-29 18 views
1

URLルーティングに.htaccessを使用するCIアプリケーションがあります。私の基本的な設定は以下の通りです:問題CodeIgniterのURLをWWWにリダイレクト

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L] 
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml) 
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L] 

これらのルールは、CIのアプリのためにかなり標準的です。例外リスト内のURLを除くすべてのURLをindex.phpフロントコントローラーに書き換えます。上記の行は、通常はすべてのURLの一部として表示されるindex.phpも隠します。

これまでのところ、とても良いです。すべてがうまく動作します。さて、SEOのために私はすべてのトラフィックをwwwに強制したいと思います。これらの最後の2行はhttp://www.jungledragon.com/anything URLへhttp://jungledragon.com/anything URLを書き換える

Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L] 
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml) 
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L] 

rewritecond %{http_host} ^jungledragon.com [nc] 
rewriterule ^(.*)$ http://www.jungledragon.com/$1 [r=301,nc] 

:だから私は、次のようにルールを拡張しました。この種の作品ですが、index.phpの部分を戻します。http://jungledragon.com/anythinghttp://www.jungledragon.com/index.php/anythingになります。

互いに干渉しないようにこれらのルールをどのように組み合わせるのですか。私は、CI規則の前にWWW書き換えをやってみました。これは実際のリダイレクトを行うのではなく、Apache 301のページにエラーがあることを示しています。

また、後続のスラッシュを取り除くためのルールも含めたいと思いますが、ここでは質問を簡単にしましょう。私はここで、他の場所で役に立つポストを見つけましたが、何らかの理由で私の状況に対して正しい正確な構文が見つからないことに注意してください。

編集:ありがとうございました。これは動作します:

Options +FollowSymlinks 
RewriteEngine on 

rewritecond %{http_host} ^jungledragon.com [nc] 
rewriterule ^(.*)$ http://www.jungledragon.com/$1 [r=301,nc,L] 

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L] 
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml) 
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L] 

答えて

2

mod_rewriteは線形方法でルールを処理します。ファイルの先頭のルールが最初に処理されます。

ルールの最後にある[nc][L]は、ルールの処理方法のオプションです。

  • NC - NOCASE
  • L insensativeケース - 最後:実行中の最後のルール(これをヒットした場合、処理を停止)

あなたのwww redirectルールを配置する必要がありますあなたのCIルールの上にあるので、最初にwwwを追加し、次にCIルールを新しく書き直したURLに適用します。 **また、www redirectルールでCまたはNフラグを使用して、次のルールを解析します。

http://mysite.com/blah ==は==>http://mysite.com/index.php/blah(次のようになります。

http://mysite.com/blah ==があり、現在何が起こっている==>http://www.mysite.com/blah ==は==>http://www.mysite.com/index.php/blah(実行、リダイレクトされません)

なりなりSTOP)

ブラウザはhttp://mysite.com/index.php/blahになり、例外の停止/インデックスの後に2回目の再書き込みパスが実行されます。示唆したように

http://mysite.com/index.php/blah ==を処理されているから、PHPのURLが==>http://www.mysite.com/index.php/blah(リダイレクト)


になりますが、さらに見たい場合は、ここでmod_rewrite's documentationへのリンクです。

@LazyOne:Brainfart、申し訳ありません。

ここであなたはおそらく必要がありますフラグをまとめたドキュメントからの抜粋です:

「チェーン| C」(次のルールでチェーン) このフラグチェーンの次のルールに現在のルールは、(それ自体は次の規則で連鎖することができます)。これには次のような効果があります。ルールが一致すると、通常どおり処理が続行されます。フラグは無効です。ルールが一致しない場合、後続のチェーンルールはすべてスキップされます。たとえば、それを使用して、.www'' part, inside a per-directory rule set, when you let an external redirect happen (where the .www ''の部分は削除しないでください。

'next | N'(次のラウンド) リライト処理を再実行します(最初のリライトルールから再開します)。今回は一致するURLはもはや元のURLではなく、最後の書き換えルールによって返されたURLです。これは、PerlのnextコマンドまたはCのcontinueコマンドに対応します。このフラグを使用して、書き換えプロセスを再開します。すぐにループの先頭に移動します。 無限ループを作成しないように注意してください。

'NOCASEは| NC'(NOの場合) これは、パターンは、現在のURLに対して一致したとき '-Z' と '-Z' の違いを無視して、パターンの大文字と小文字を区別しないことができます。 'noescape | NE'(出力のエスケープURIなし) このフラグは、mod_rewriteが通常のURIエスケープ・ルールを書き換えの結果に適用するのを防ぎます。通常、特殊文字( '%'、 '$'、 ';'など)は、それぞれ対応する16進コード( '%25'、 '%24'、および '%3B')にエスケープされます。このフラグはこれが起こらないようにします。これにより、パーセント記号が出力に表示されます。

+0

OPルールには[C]フラグはなく、[NC]のみです。 OPが少しだけ自分自身を学ぶことができるように、Apacheのmor_rewriteマニュアルへのリンクを投稿することもできます。 – LazyOne

+0

申し訳ありませんがまだ反応していません、仕事中ですが、今夜これを試します。 – Ferdy

+0

+1完璧です。ありがとう – brenjt

関連する問題