0

私は最終的に、私のサイトで以下の形式で正規表現を使用してきれいな URL を作成するための良い/簡単な方法を見つけましたが、非常に大きな .htaccess ファイルが必要になります。 mod_rewrite を使用するパフォーマンスについてですが、サイトのほぼすべてのページに個別のエントリを使用して、私がいる場所で実際に使用されているのを見たことがありません。

以下はエントリの例です。1 ページに 2 つのエントリがあり、最初のエントリが書き換えられます。

http://www.example.com/users/online/friends/
から
http://www.example.com/index.php?p=users.online.friendsへ

それはうまく機能しますが、ユーザーが最初のページにいない場合、ページングのために URL に別のものが追加され、これが発生したときに書き換えるために別のエントリを作成する必要がありました。これは正しい方法ですか、それともこれらを何らかの方法で組み合わせる必要がありますか?

RewriteRule ^users/online/friends/*$ ./index.php?p=users.online.friends&s=8
RewriteRule ^users/online/friends/(\d+)/*$ ./index.php?p=users.online.friends&s=8&page=$1

2番目のものはこれを行います

http://www.example.com/users/online/friends/22/
から
http://www.example.com/index.php?p=users.online.friends&page=22

4

3 に答える 3

3

はい、大丈夫です。それらを 1 つのルールに組み合わせることができると思いますが、実際には必要ありません。

次の代わりに、ページを URL の一部として残すことを検討してください。

http://www.domain.com/users/online/friends/22/

ただ持っている:

http://www.domain.com/users/online/friends?page=22

次に、次のような 1 つのルールを設定します。

RewriteRule ^users/online/friends/?$ ./index.php?p=users.online.friends&s=8 [L,QSA]

クエリ文字列を追加するには

編集:書き換えルールの数を減らす方法がいくつかあります。

まず、次のように検索語にワイルドカードを使用します。

RewriteRule ^users/(\w+)/(\w+)$ /index.php?p=users.$1.$2 [L,QSA]

かなりの数のルールを削減します。

次に、すべてを /index.php 経由で渡す場合は、すべてのリクエストをそこに委譲することを検討してください。

RewriteRule ^(users/*)$ /index.php/$1 [L,QSA]

このルールは 3 番目の手法を使用します。クエリ文字列パラメーターを介してパス情報を渡す代わりに、追加のパス情報を介して渡します。経由でアクセスできます$_SERVER['PATH_INFO']

そうは言っても、多くのルールが必ずしも悪いわけではありません。少なくとも、あなたのすべての行動について明確です。ただし、注意しなければならないのは、メンテナンスの悪夢を作成することです。

于 2009-09-21T02:25:03.857 に答える
3

どちらがより読みやすいと思うかによって異なりますが、単一のルールでそれを行う方法は次のとおりです。

RewriteRule ^users/online/friends(/(\d+))?/*$ ./index.php?p=users.online.friends&s=8&page=$2

(元の質問の末尾のスラッシュの処理により忠実になるように編集しました。だった: RewriteRule ^users/online/friends/((\d+)/*)?$ ./index.php?p=users.online.friends&s=8&page =$2 )

ここに「(...)?」と入れただけです。URL の最後の部分を囲んで任意の一致にし、後方参照を $2 に変更しました。

もちろん、これは実際にはhttp://www.domain.com/users/online/friends/を次のように書き換えます。

http://www.domain.com/index.php?p=users.online.friends&page=

そのため、PHP コードは、ページ パラメーターが空でないかどうかを確認する必要があります。

于 2009-09-21T02:44:59.777 に答える
2
# Initial step
RewriteCond %{QUERY_STRING} !(?:^|&)p=
RewriteRule ^([^/]+)/(.+) /$2?p=$1 [QSA]

# Subsequent steps
RewriteCond %{QUERY_STRING} ((?:[^&]*&)*?)p=([^&]*)(.*)
RewriteRule ^([^/]+)/(.+) /$2?%1p=%2.$1%3

# Last step with page number
RewriteRule ^(\d+)/?$ /index.php?page=$1 [QSA,L]

# Last step without page number
RewriteCond %{QUERY_STRING} (?:((?:[^&]*&)*?)p=([^&]*))?(.*)
RewriteRule ^([^/]+)/?$ /index.php?%1p=%2.$1%3 [L]

これにより、いくつかの手順で URL が書き換えられます。

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/online/friends/22/?p=users
  3. http://www.domain.com/friends/22/?p=users.online
  4. http://www.domain.com/22/?p=users.online.friends
  5. http://www.domain.com/index.php?p=users.online.friends&page=22

より簡単な方法は次のとおりですが、スクリプトを変更する必要があります。

RewriteRule ^(.*?)(?:/(\d+))?/?$ /index.php?p=$1&page=$2 [QSA,L]

少しの違いはありますが、すべてを 1 つのステップで実行します。

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/index.php?p=users/online/friends&page=22

クエリ引数を追加するにs=8は、さらに作業が必要になります。

  1. 各ページのメニュー番号を含むテキスト ファイルを作成します。
  2. RewriteMapディレクティブの追加。
  3. 最後から 2 番目のルールを、最後のルールと同じものを使用するように変更しRewriteCondます。
  4. &s=%{menumap:%2|0}最後の 2 つのルールに追加します。
于 2009-09-21T03:08:53.700 に答える