4

非常によく回答された以前の質問がありますが、修正が必要で、回答できなかったため、新しい質問を作成しました。

次のような mod_rewrite が必要でした。

www.example.com?page=var1&cat=var2&subcat=var3&subsubcat=var4

これに:

www.example.com/var1/var2/var3/var4/

ただし、var2、var3、および var4 のオプションの使用もカバーしているため、これらの変数が空の場合でも機能します。

質問には非常によく答えられましたが、var2、var3、および var4 のさまざまなフィールド オプションを使用するには修正が必要です。

私が持っているコードは次のとおりです。

RewriteEngine on
Options +FollowSymlinks -MultiViews

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/?$ /?page=$1 [L]

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/?$ /?page=$1&cat=$2 [L]

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3 [L]

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3&subsubcat=$4 [L]

これは機能しますが、どのフィールドがどの変数に使用されているかを選択するために if-or-else を作成し、違いを伝えることができるようにする必要があります。

たとえば、通常、次の 2 つの文字列がある場合、どのフィールドがどの変数に使用されるかを簡単に区別できます。

www.example.com?page=var1&cat=var2&subcat=var3&subsubcat=var4

www.example.com?othervar1=var1&othervar2=var2&othervar3=var3&othervar4=var4

ただし、この文字列の場合、変数がどのフィールド用であるかを区別する機能が必要です。

www.example.com/var1/var2/var3/var4/

どちらが使用されているかを選択するには、mod_rewrite が必要です。

これと同様に、実際に存在するフォルダーに移動すると、正しく機能します。たとえば、実際のフォルダーである「test」というフォルダーに移動すると、次のようになります。

www.example.com/test/

「ページ」フィールドの変数として使用します。最後のスラッシュなしで次を使用すると:

www.example.com/test 

以下を URL に出力します。

www.example.com/test/?page=test

通常どおり存在するフォルダーでも機能する必要があります。

誰かがこれを行う方法を教えてください。この問題を解決するための助けをいただければ幸いです。

また、これに遭遇したことがないので、最初に「-MultiViews」ビットが何を意味するのか誰か教えてもらえますか?

ありがとうございました。

4

1 に答える 1

2

最初にMultiViewsオプションをOK します: Apache のマニュアルによると:

マルチビュー

Content negotiated "MultiViews" are allowed using mod_negotiation.

要するに、というファイルがfoo.htmlあり、ブラウザがリクエストした場合http://example.com/foo、Apache は拡張子を自動的に見つけて追加し、404foo.htmlをスローするのではなく、ブラウザに提供します。この動作により、多くの書き換えルールが失敗するため、以前の質問への回答で最初に無効にしました。

実際のディレクトリが書き換えルールによって処理されないようにするには、次のような条件を追加する必要があります。RewriteCond %{REQUEST_FILENAME} !-d

複数のプリティ URL スキームをサポートするには:

ここにはいくつかのオプションがあります。どちらが欲しいか教えてください。そのためのルールを提供します。

オプション 1: 次のように URL にと の両方var nameを含めます。var value

www.example.com/page/var1/cat/var2/subcat/var3/subsubcat/var4また
www.example.com/othervar1/var1/othervar2/var2/othervar3/var3/othervar4/var4

これにより、最大限の柔軟性が得られ、このルートに進む意思がある場合は、Rewrite ルールで非常に簡単に処理できます。このオプションでは、書き換えルールを 1 回だけ記述する必要があります。変数の数が変わらない限り、将来の変更に問題はありません。

オプション 2:スキームごとに異なる開始点を設定します。例:

www.example.com/handler1/var1/var2/var3/var4また
www.example.com/handler2/var1/var2/var3/var4

これは短い URL を提供しますが、前のオプションのような柔軟性は提供しません。しかし、これも Rewrite ルールで非常に扱いやすいものです。ただし、このオプションでは、すべての組み合わせに対して書き換えルールを記述する必要があります

したがって、オプション 1をお勧めします。このオプションも気に入った場合は、喜んで .htaccess を用意します。

オプション 2 の .htaccess ファイル

Options +FollowSymlinks -MultiViews
RewriteEngine on

# 404 handler
ErrorDocument 404 /notFound.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^handler1/([^/]+)/?$ /?page=$1 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]+)/?$ /?page=$1&cat=$2 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3subsubcat=$4 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^handler2/([^/]+)/?$ /?othervar1=$1 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]+)/?$ /?othervar1=$1&othervar2=$2 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]*)/([^/]*)/?$ /?othervar1=$1&othervar2=$2&othervar3=$3 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?othervar1=$1&othervar2=$2&othervar3=$3othervar4=$4 [NC,QSA,L]


オプション 1 の .htaccess ファイル

Options +FollowSymlinks -MultiViews
RewriteEngine on

# 404 handler
ErrorDocument 404 /notFound.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA,DPI]
RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA,DPI]

これらのルールを使用すると、 の URL は で区切られた URL セグメントの各ペアを QUERY_STRINGのペアとして扱うhttp://localhost/n1/v1/n2/v2/n3/v3/n4/v4ように内部的にリダイレクトされます。ただし、URI に偶数のセグメントがない場合は注意してください。たとえば、URI はにリダイレクトされ、余分な n2 が破棄されます。http://localhost/?n4=v4&n3=v3&n2=v2&n1=v1/name-valuehttp://localhost/n1/v1/n2/http://localhost/?n1=v1

于 2011-04-25T12:26:11.600 に答える