1

友達 私は .htaccess と Rewrite Rule の初心者で、これらのルールについて非常に困惑しています。index.php ページに対して次の行を実行しようとしています。URL、1 つまたは 2 つまたは 3 つまたは 4 つのクエリ引数を書き込むと、問題なく動作します。これらのパターン マッチのいずれかでクエリを収集し、php.ini でさらに処理を進めます。しかし、クエリの引数が 4 つ以上の引数を超える場合 (誰かが意図的に間違った URL を与えようとしているとします)、ページをホームページにリダイレクトしたいと考えています。インターネット上のどこにも解決策が見つかりませんでした。誰でも私を助けることができますか、それを行う方法. このプロジェクトを実行するための解決策が切望されており、非常に緊急に必要です。多くの記事を読みましたが、この問題の処理方法がわかりません。Win 7でXAMPPを使用してこれらすべてのタスクを実行しています。使用しているパターンは、

RewriteRule ^([a-zA-Z0-9_]+)/?$ index.php?levelone=$1 [NC]

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ index.php?levelone=$1&leveltwo=$2 [NC]

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ index.php?levelone=$1 &leveltwo=$2&levelthree=$3 [NC]

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_ ]+)/?$ index.php?llevelone=$1&leveltwo=$2&levelthree=$3&levelfour=$4 [NC]


URL の例: (localhost/myproject/index.php が私のホームページだとします)

ローカルホスト/マイプロジェクト/レベルワン/

ローカルホスト/myproject/レベルワン/レベルツー/

ローカルホスト/myproject/レベルワン/レベルツー/レベルスリー/

ローカルホスト/myproject/レベルワン/レベルツー/レベルスリー/レベルフォー

これらの 4 つの URL を使用する場合は問題ありませんが、

localhost/myproject/index.php/levelone/leveltwo/levelthree/levelfour/levelfive/levelsix/

その後、私のindex.phpページはスタイルとレイアウトのないHTMLを返します.htaccessで多くの種類のRewriteCondとコマンドを試しましたが、すべて無駄でした.

クエリ文字列の引数は、範囲を超える場合は 1 から 4 の範囲である必要があり、たとえば 5 つの引数の場合、ページは再びホームページ (/index.php) にリダイレクトする必要があります。それ以外の場合は、パターンに一致します。これら4つの長いパターンをすべて1つの短い行に組み合わせて、4つのいずれかに一致させる方法があるかどうかを誰かが知っていると助かります.

4

2 に答える 2

2

この書き換えルールは、既に存在するファイルまたはディレクトリがない場合にのみ適用されます。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /path/to/index.php [L,QSA]

-f フラグは、ファイルが存在しない場合にのみ書き換えを開始し、 -d フラグは、ディレクトリが存在する場合に書き換えが開始されないようにします。

于 2015-12-02T17:54:54.773 に答える
1

ホームページへのリダイレクトは避けることをお勧めします。index.php では、レベル変数が設定されていない場合、デフォルトでホームページのコンテンツを表示します。

これは1行のルールです(おそらくもっと単純化できます):

RewriteRule ^(?:([a-zA-Z0-9_]+)\/)?(?:([a-zA-Z0-9_]+)\/)?(?:([a-zA-Z0-9_]+)\/)?(?:([a-zA-Z0-9_]+)\/)?$ index.php?level1=$1&level2=$2&level3=$3&level4=$4 [L]

そしてPHP:

$levels=array();

foreach (range(1,4) as $i) {
  if (isset($_GET['level'.$i])) {$levels[$i]=$_GET['level'.$i];}
}

if (!empty($levels)) {
  // show level content
} else {
  // show home page
}
于 2013-02-01T21:30:17.873 に答える