web-dev-qa-db-ja.com

簡単な.htaccess言語の質問(リダイレクト)

.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=*$でしょうか

2
IXN

これは、.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=で始まりanythingnothingを含む)が続くクエリ文字列に一致します。例えば:

RewriteCond %{QUERY_STRING} ^m=

ただし、通常、正規表現はできるだけ制限する必要があります(ただし、この場合は適用されない場合があります)。たとえば、クエリ文字列?m=Nのみを含むURLに一致させるには、Nは0〜9の数字であり、他のURLパラメータはありません。次のようにできます。

RewriteCond %{QUERY_STRING} ^m=\d$

ここで、\dは、任意の数字の簡略文字クラスです([0-9]と同じ)。

脇:302(一時)リダイレクトでテストして、キャッシュの問題を回避し、テストの前にブラウザーのキャッシュをクリアします。

5
MrWhite