0

私はこの3つのURLタイプを持っています:

  • site.com/page
  • site.com/page/action
  • site.com/page/action?params

「ページ」は常にここにありますが、あと 2 つはありません

毎回このように機能させるにはどうすればよいですか?

RewriteRule ^(.*)/(.*)?(.*)$ $1.php?action=$2&$3

これで、最後の 2 つの部分がここにない場合は、作業を停止してください.

ありがとう!

4

2 に答える 2

1

これには複数のルールが必要になります (1 つでも構いませんが、読みやすさの観点からは 2 つの方が良いでしょう。

まず、クエリ文字列を忘れてください。あなたはそれを操作しておらず、[QSA]フラグはそれを結果の URL に追加する作業を行うことができます。

ここで、「アクション」バリアントを処理するルールと、ページ名のみを処理するルールの 2 つのルールが必要になります。

RewriteRule ^[^/]+$ $0.php [L]
RewriteRule ^([^/]+)/([^/]+) $1.php?action=$2 [L,QSA]

ただし、これにより書き換えループが発生します。mod_rewrite の仕組みは、ほとんどの場合、ルールが少なくとも 2 回実行され、2 回目 (およびそれ以降のすべて) の反復で、最初のルールが書き換えられた URL と一致することを意味します。

したがって、もう少し具体的にする必要があります。

RewriteRule ^(?:(?!\.php$)[^/])+$ $0.php [L]
RewriteRule ^([^/]+)/([^/]+)$ $1.php?action=$2 [L,QSA]

この先読みにより、最初のルールが で終わらない URI のみに一致することが保証され.phpます。

QSAフラグは 2 番目のルールにのみ適用されることに注意してください。これは、書き換えられた URI によってクエリ文字列が変更された場合にのみ効果があるためです。デフォルトの動作 (クエリ文字列が変更されていない場合) では、元のクエリ文字列が追加されます。

于 2013-10-23T13:52:48.687 に答える
1
RewriteRule ^(.*)/(.*)$ $1.php?action=$2 [QSA,L]
RewriteRule ^(.*)$ $1.php [QSA,L]
于 2013-10-23T13:45:22.407 に答える