mod_rewriteルールの正規表現で疑問符に一致
-
03-07-2019 - |
質問
URLを複数のサブストリングで書き換えたいと思っています。 1つのサブストリングはサブディレクトリとして要求され、他のサブストリングは通常のクエリ文字列パラメーターとして要求されます。
たとえば、URLを書き換えたい
http://www.mysite.com/mark/friends?page=2
to
http://www.mysite.com/friends.php?user=mark&page=2
疑問符を除いてこれを達成できます。ここに私の書き換えルールがあります:
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L]
疑問符を他の文字に変更すると、うまく機能します。問題は「?」文字が新しいクエリ文字列の開始として誤って解釈されています。
/ user / friendsの後に表示されるパラメーターをそのまま渡す必要があります。どうすればこれを達成できますか?
解決
クエリ文字列を書き換えるのではなく、 [QSA]
フラグを使用する必要があります。 [QSA]
は、クエリ文字列を書き換えられたURLに渡します。
したがって、ルールは次のようになります。
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]
あなたのケースは、 mod_rewriteクックブックでQSAフラグを使用する例と非常に似ています。
他のヒント
クエリはURLパスの一部ではないため、 RewriteRule
ディレクティブで処理されます。これは、 RewriteCond
<でのみ実行できます。 / a>ディレクティブ(%{QUERY_STRING}
を参照)。
しかし、チャドバーチがすでに言ったように QSA
フラグを設定するだけで十分です >新しいURLに追加された元の要求されたクエリを自動的に取得します。
書き換えフラグQSAの使用に加えて、以下に示すようにQUERY_STRING環境変数を使用することもできます。
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING}
そして問題のURL
http://www.example.com/mark/friends?page=2
に書き換えられます(指定どおり):
http://www.example.com/friends.php?user=mark&page=2
所属していません StackOverflow