.htaccessの言語がわからないため、初心者の質問です。私はこのコードを持っています:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^m=1$
RewriteRule (.*) /$1? [R=301,L]
この拡張子?m=1
を持つURLを、拡張子のないURLにリダイレクトします。
?m=0
(または?m=anything
)も元のURLにリダイレクトしたいと思います。上記のコードをどのように書き直す必要がありますか?それはただRewriteCond %{QUERY_STRING} ^m=*$
でしょうか
これは、.htaccess
よりも正規表現(regex)に関する問題です。 RewriteCond
ディレクティブの2番目の引数(CondPattern)は、wildcard式ではなく、正規表現を取ります。 (具体的には、 Apacheは正規表現のPCREflavour を使用します。)
それはただ
RewriteCond %{QUERY_STRING} ^m=*$
でしょうか
いいえ。これは、引数がより単純なwildcard型式(*
が単に0個以上の文字に一致する)であると想定しています-そうではありません。正規表現では、*
は、の前の文字/グループの0回以上の出現に一致します。したがって、これは?m
(0回の出現)、?m=
(1回の出現)、?m==
または?m===
などと完全に一致します。意図はまったくありません。元のURLとも一致しません。
m
URLパラメーターが常にクエリ文字列の先頭にあると仮定すると、?m=<anything>
に一致させるには、単に正規表現^m=
を使用できます。これは、m=
で始まりanything(nothingを含む)が続くクエリ文字列に一致します。例えば:
RewriteCond %{QUERY_STRING} ^m=
ただし、通常、正規表現はできるだけ制限する必要があります(ただし、この場合は適用されない場合があります)。たとえば、クエリ文字列?m=N
のみを含むURLに一致させるには、Nは0〜9の数字であり、他のURLパラメータはありません。次のようにできます。
RewriteCond %{QUERY_STRING} ^m=\d$
ここで、\d
は、任意の数字の簡略文字クラスです([0-9]
と同じ)。
脇:302(一時)リダイレクトでテストして、キャッシュの問題を回避し、テストの前にブラウザーのキャッシュをクリアします。