1

次のルールがあります。

RewriteRule ^app ?page=app [QSA]
RewriteRule ^app/([0-9]+) ?page=app&id=$1 [QSA]
RewriteRule ^app/([0-9]+)/edit ?page=edit&id=$1 [QSA]

私のページはGETパラメータを出力します。/app を呼び出すと、次のように表示されます。

Array ( [page] => app )

/app/123 または /app/123/edit を呼び出すと、印刷は同じままです。ただし、コマンドの順序を逆にすると、異なる結果が得られます。

/app/123/edit の場合:

Array ( [page] => edit [id] => 123 )

/app/123 の場合:

Array ( [page] => app [id] => 123 )

何故ですか?また、それを変更する方法はありますか?逆ではなく、上から下の階層順でコマンドを進める方が簡単に思えるからです。前もって感謝します。

4

2 に答える 2

3

その場合、「文字列の終わり」記号を使用する必要があります$

RewriteRule ^app$ ?page=app [QSA]
RewriteRule ^app/([0-9]+)$ ?page=app&id=$1 [QSA]
RewriteRule ^app/([0-9]+)/edit$ ?page=edit&id=$1 [QSA]

それ以外の場合、最初のexpはすべてのURLフォームと一致するため、常に使用され、ルールチェックによって2行目に到達することはありません。

于 2013-01-20T17:23:42.740 に答える
0

これは本当に便利なリソースです:

http://martinmelin.se/rewrite-rule-tester/

2 番目と 3 番目が一致しない理由は、最初のルールの出力によって初期 URI が消去されるためです。

必要な実際のルールは次のとおりです。

RewriteRule ^(app/?.*) $1?page=app [QSA]
RewriteRule ^(app/([0-9]+)/?.*) $1?page=app&id=$2 [QSA]
RewriteRule ^(app/([0-9]+)/edit) $1?page=edit&id=$2 [QSA]

上記のテスト ページで app/123/edit を使用してこれらをテストすると、すべてのルールが一致し、次のように適用されます。

#   Match?  Rule    Resulting URL
1   yes RewriteRule ^(app/?.*) $1?page=app [QSA]    app/123/edit?page=app
2   yes RewriteRule ^(app/([0-9]+)/?.*) $1?page=app&id=$2 [QSA] app/123/edit?page=app?page=app&id=123
3   yes RewriteRule ^(app/([0-9]+)/edit) $1?page=edit&id=$2 [QSA]   app/123/edit?page=edit&id=123

テスターが QSA フラグを正しく処理しているとは思えません。各ルールで新しいキーと値のペアを指定するだけでよく、以前のものを再度説明する必要はありません。QSA はそれらをマージする必要があります。ルールの本当の誤りは、URI を保存しないことでした。

于 2013-01-20T17:53:56.687 に答える