2016-11-22 10 views
2

フォルダ構造:htaccessのはかなり機能していないのURL

- assets 
    - all css/js 
- calsses 
    - all models, db ant etc 
- views 
    - admin 
    - app 
    - index.php 
    - customers.php 
    ....... 

私の.htaccess

RewriteEngine on 

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

RewriteCond %{HTTP_HOST} ^(www.)?localhost:8080$ 

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

アドレス:localhost:8080/app/ - 正常に動作しますが、その後、私は私のcustomers.php、例えばかなりのURLを追加してみてください - localhost:8080/app/customers.php?id=5localhost:8080/app/customers/id/5

htaccessが新しい行に変更:

0に変更してください
RewriteRule /id/(.*) customers.php?id=$1 

これは正常に動作しないため、常に返信します500内部サーバーエラー問題がありますか?

プラスの.phpのないすべてのURLは、あなたはすべてのルールのためのこれらの条件を含める必要があるだろう

+0

/id/(.*)は常にcustomers/php?** id **と一致しますので、ルールは常にループします – Gerrit0

+0

私のケースで動作する行を変更するにはどうすればよいですか? –

+2

申し訳ありませんが、私はあまりにも面倒だった、その問題はその行ではなく、問題はあなたの最初のルールであり、常に一致し、常に/ビュー/をあなたのURLの先頭に追加します。 htaccessのルールは信じられないほど簡単にうまくいきます。私はこの質問にうまく答えようとする前にもう少し学ぶ必要があります。 – Gerrit0

答えて

6

を拡張する必要があります。 views/router.phpと言ったら、PHPを使って異なるコントローラを組み込むことや、URLが有効でないときに404を提供するほうがよいでしょう。

RewriteRule !^views/router\.php$ views/router.php [NS,L,DPI] 
+0

を表示します。また、ほとんどのPHP webapps/frameworksがindex.phpに書き換えられ、どのようなルーティングも含めてすべての必要なコードがロードされます –

0

もう一つの亀裂があります。

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{HTTP_HOST} !^(?:www\.)?localhost:8080$ [OR] 
RewriteCond $0 =views 
RewriteRule [^/]* - [END] 

RewriteRule ^(app|admin)/([^/]+) views/$1/$2.php [DPI,END] 
RewriteRule ^(app|admin)/?$ views/$1/index.php [DPI,END] 

あなたのApacheが古い場合L代わりENDのフラグを使用する必要があります。 404のErrorDocumentも設定してください。

質問文字列で悩むのではなく、PHPで$_SERVER['REQUEST_URI']を解析するだけです。 /でそれを爆発させてください。次に、元のpretty URLのすべてのパラメータを取得します。各コントローラが同じコードを再利用できるようにインクルードでその部分を行うことができます。

1

How to make Clean URLsは、私は、これはあなたが必要なものだと思い、質問を参照してください。

あなたは私があなたの構造を試してみましたが、自分自身をファイル.htaccessファイルとApacheのログに無限ループを発見したRewriteRule ^(.*)$ index.php [QSA,L]

0

を使用することができます。リード/試合のために必要されていない

RewriteRule id/(.*) /views/app/customers.php?id=$1 

とターゲットが完全なパスが必要です。私のような最後のルールを追加することによって、それを修正することができ

Mon Nov 28 19:57:32.527765 2016] [core:error] [pid 10] [client 172.18.0.1:35048] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace. 

:私はあなたがこのような何かを持って賭けます。 URLにhttp://localhost:8080/id/123というid double(123/123など)があることに注意してください。

これは前の2つのルールのいずれかが原因で発生するため、修正する必要があります。ここで

0

は、あなたが望むものである:私はルータクラスを通じてその取り扱いルートにWalfに同意

RewriteEngine On 
RewriteBase /app/ 

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

RewriteRule ^\/?$ views/index.php [L] 
RewriteRule ^([a-zA-Z0-9]+)\/([a-zA-Z0-9]+)\/([a-zA-Z0-9]+)\/?$ views/$1.php?$2=$3 [L] 
RewriteRule ^([a-zA-Z0-9]+)\/?$ views/$1.php [L] 
1

は、特に長期的には(良いアイデアです!)を使用しています。.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のルールは非常に混乱する可能性があります。

関連する問題