-1

http://www.site.com/index.php/test/現在、以下を使用してで直接動作するように書き換えていますhttp://www.site.com/test/が、2番目のバージョンを許可するだけでなく、2番目のバージョンを強制したいと考えています。ユーザーが にhttp://www.site.com/index.php/test/アクセスした場合、すぐに に再ルーティングする必要がありhttp://www.site.com/test/ます。index.php は URL に表示されません。条件: これは最初の index.php にのみ適用されます。http://www.site.com/index.php/2011/06/08/remove-index.php-from-urls/URL の一部であるため、2 番目の index.php を残す必要があるようなタイトルがある場合。

許可するが強制しない現在のルール: #Remove index.php RewriteCond $1 !^(index.php|images|css|js|robots.txt) RewriteRule ^(.*)$ /index.php/$1 [L]

ありがとう。

4

2 に答える 2

3

最初の(そして間違った)答え - 以下を参照

次のディレクティブを使用してリダイレクトを実行できます (この順序で)。

RewriteCond %{REQUEST_URI} ^index.php
RewriteRule ^index\.php/(.+)$ /$1 [R,L]

RewriteCond $1 !^(index.php|images|css|js|robots.txt)
RewriteRule ^(.*?)$ /index.php/$1 [L]

これにより、最初に で始まるすべてのリクエストが対応する短縮 URL にリダイレクトされ、次に2 番目のルールがサイレントに処理されます。index.phpindex.php/etc

編集 - 読み進めてください!

実際、上記のソリューションでは無限のリダイレクト ループが生成されます。これは、Apache が次のアクションを実行するためです (たとえば、 をリクエストするとします/index.php/abc)。

  1. 最初のRewriteCond試合
  2. Apache は [R] をリダイレクトします。つまり、新しい HTTP リクエストを生成します。/abc
  3. /abc最初に失敗するRewriteCond
  4. /abc2 番目に一致RewriteCond
  5. Apache はリダイレクトしませんが、この URI を/index.php/abc. 再びポイント 1 に到達しました。これがループです。

ご注意ください...

  • [L] (最後のルール) フラグを使用することで、現在のルールが一致する場合にのみ、これ以上書き換えルールを処理しないように Apache に指示できます。新しい HTTP リクエストが作成されたため、リダイレクトがどのように行われたかについての情報はまだありません。そのため、2 つのうちの 1 つが一致するたびに、新しいリクエストが生成されます (=>ループ)。
  • [C] (チェーン ルール) フラグを使用しても意味がありません。これは、前のルールが一致する場合にのみ Apache がルールを処理するようにするためです。一方、2 つのルールは相互に除外されます。
  • ルール #1 で [NS] (not if subrequest) フラグを使用することは、単に私たちのケースには当てはまらないため、オプションではありません (これについてはApache RewriteRule のドキュメントを参照してください) 。
  • 環境変数を設定することはオプションではありません (残念ながら)。pt 2 で新しい要求が行われるため、設定したすべての環境変数が破棄されます。

/abc別の解決策は、たとえばに書き直すこと/index.php?path=abcです。これは、次のルールによって行われます (これらを追加する前に、RedirectMatch 同様のルールを削除してください)。

RedirectMatch ^/index\.php(/.*) $1

RewriteCond %{REQUEST_URI} !^/(index.php|images|css|js|robots.txt|favicon.ico)
RewriteRule ^(.+) /index.php?path=$1 [L,QSA]

CodeIgniter のスクリプトの内部構造はわかりませんが、ほとんどの MVC スクリプトと同様に、$_REQUEST['PATH_INFO']どのページが要求されているかを理解するために読み取ります。$page次のように、ページを認識するコードを少し変更できます (ページ パスはvarに格納されていると仮定しました)。

$page = $_REQUEST['PATH_INFO'];
if(isset($_GET['path']) && strlen($_GET['path'])) $page = $_GET['path']; // Add this line

これにより、以前のコードが壊れたり、要求したことが達成されたりすることはありません。

于 2011-06-08T07:57:58.260 に答える
2

あなたが書いたように、ユーザーがhttp://www.site.com/index.php/test/このルールに従うと、すぐに彼を次の場所に再ルーティングしますhttp://www.site.com/test/

RedirectMatch 301 /index.php/(.*)/$ /$1

現在の書き換えルールが私のものとは反対であるため、それが必要かどうかはわかりません。

于 2011-06-08T07:43:45.513 に答える