2009-05-04 6 views
20

URLを複数の部分文字列で書き換えようとしています。あるサブストリングはサブディレクトリーとして要求されていますが、他のサブストリングは通常の照会ストリング・パラメーターとして要求されています。mod_rewriteルールの正規表現での疑問符の一致

例えば、私は疑問符を除いてこれを達成することができる午前

http://www.mysite.com/friends.php?user=mark&page=2 

http://www.mysite.com/mark/friends?page=2 

からURLを書き換えるしたいと思います。私はそれは素晴らしい作品他の文字に疑問符を変更した場合

... 
RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L] 

:ここに私の書き換えルールです。問題は、 '?'文字が新しいクエリ文字列の先頭として誤って解釈されています。

/user/friendsの後に表示されるパラメータをそのまま渡す必要があります。これをどのように達成するのですか?

答えて

33

クエリ文字列を書き換えようとする代わりに、[QSA]フラグを使用する必要があります。 [QSA]は、クエリ文字列を書き換えられたURLに渡します。

だからあなたのルールは次のようになります。あなたの場合はthe example given for using the QSA flag in the mod_rewrite cookbookに非常に似て

... 
RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L] 

+0

お返事ありがとうございます。本当にうまくいっていて、今私は料理本を読んでいます。 – markb

+0

私にとってはコードを編集しましたが、Supersの解決策は私にとってもうまくいきました。RewriteRule ^([A-Za-z0-9 -_] +)\。php? pindex.php?typeofpage = $ 1 [QSA、L] –

10

query is not part of the URL path and thus cannot be processed with the RewriteRule directive。これは、RewriteCondディレクティブ(%{QUERY_STRING}参照)でのみ行うことができます。

ただし、as Chad Birch already saidの場合は、QSA flagに、新しいURLに追加された元の要求クエリを自動的に取得するだけで十分です。下図のように書き換えフラグQSAを使用することに加えて

+0

QSAにはhttps://stackoverflow.com/questions/16468098/what-is-l-in-qsa-l-in-htaccess/16468677#comment79837245_16468677に記載されている問題があります。 。また、rewritecond query_stringは、問合せ文字列のないリクエストと、裸の問合せ文字列を持つリクエスト(つまり、単一の疑問符とそれ以外のもの)とを区別できません。これらの2つの要求を区別する方法はありますか? – Pacerier

+0

OK nbm ..それを見つけました: '$ {the_request} ' – Pacerier

1

、あなたはまた、QUERY_STRING環境変数を使用することができます。

RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING} 

を質問

http://www.example.com/mark/friends?page=2 

内のURLは(ように書き換えられます指定):

http://www.example.com/friends.php?user=mark&page=2 
+0

クール'%{QUERY_STRING}'が動作します。 – Pacerier