は、特に長期的には(良いアイデアです!)を使用しています。.htaccess
リダイレクトを使用しています。
しかし、あなたの質問には、どうやってどうやってやるべきなのかということよりもうまくいかない理由があるようですが、ここでは何が起こっているのか説明しています。
私は例として、これらのURLを使用する:
localhost:8080
localhost:8080/app
localhost:8080/app/customers/id/5
あなたの最初のルール:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8080$
RewriteRule ^(.*)$ /views/$1
をあなたが意図したように、こののRewriteRuleはファイルではなく、ディレクトリではありません任意のURLにマッチしますlocalhost:8080にします。
localhost:8080 # not matched because it leads to a directory.
localhost:8080/app -> localhost:8080/views/app
localhost:8080/app/customers/id/5 -> localhost:8080/views/app/customers/id/5
あなたの次のルール:
RewriteRule ^(/)?$ /views/index.php [L]
するRewriteCond文は、このように、ここでチェックされていることすべてがパスであり、それらを以下のみ最初のRewriteRuleに適用することを認識することが重要です。
サイドノート:^(/)?$
は、$1
を使用していないため、^/?$
に簡略化することができます。
localhost:8080 -> localhost:8080/views/index.php
localhost:8080/views/app # not matched
localhost:8080/views/app/customers/id/5 # not matched
L
フラグが指定されているように、Apacheは直ちに現在反復を停止して、先頭から再度マッチングを開始します。 The documentation is badly worded。したがって、localhost:8080/views/index.php
は、最初のルールで実行され、一致に失敗し、このルールを実行し、一致しなくなり、(まだ)書き換えが行われていないことを確認する他のルールが存在しなくなります。
ここで、壊れたルールを追加するとどうなるかを見てみましょう。
RewriteRule /id/(.*) customers.php?id=$1
ここにはいくつかの問題があります。まず、URLが/id/
で始まることを要求しないので、ルールはすでにURLを書き換えていても、/id/
を含むURLと常に一致します。 ^/id/(.*)
を使用してこれを修正した場合、RegExの書き換えがテストされた文字列には引き続きスラッシュが削除されているという問題があります。最後に、最も重要なことは、customers.php
がルートディレクトリに存在しないことです。
localhost:8080/views/index.php # not matched
localhost:8080/views/app # not matched
localhost:8080/views/app/customers/id/5 -> localhost:8080/customers.php?id=5
これは現在ファイル内の最後のルールであるため、Apacheがやり直します。ディレクトリにcustomers.php
が存在しないため、views/customers.php
に書き換えられます。他のルールは一致していませんが、URLが変更されているため、Apacheは再び起動します。/views/customers.php
は存在しません。/views/views/customers.php
...に書き換えられます。このパターンは、反復回数の上限に達するまで繰り返され、Apacheは500エラー。
これはいくつかの方法で解決できます。ここに私の好みの方法がありますが、ルータを使用できない場合に限ります。
RewriteEngine on
# Rewrite the main page, even though it is a directory
RewriteRule ^/?$ views/index.php [END]
# Don't rewrite any existing files or directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .? - [S=999,END]
RewriteRule ^app/?$ views/app/index.php [END]
RewriteRule ^app/id/(.*)$ views/app/customers.php?id=$1 [END]
TL; DRはPHPベースのルータを使用します。 .htaccess
のルールは非常に混乱する可能性があります。
/id/(.*)は常にcustomers/php?** id **と一致しますので、ルールは常にループします – Gerrit0
私のケースで動作する行を変更するにはどうすればよいですか? –
申し訳ありませんが、私はあまりにも面倒だった、その問題はその行ではなく、問題はあなたの最初のルールであり、常に一致し、常に/ビュー/をあなたのURLの先頭に追加します。 htaccessのルールは信じられないほど簡単にうまくいきます。私はこの質問にうまく答えようとする前にもう少し学ぶ必要があります。 – Gerrit0