web-dev-qa-db-ja.com

301リダレクトのMod_rewrite削除パラメータ

書き換えはどうすればいいですか。

http://www.example.com/?aff=number

に:

http://www.example.com

URL内の他のパラメータの数に関係なく、aff=xのすべてのインスタンスを削除します。

2
Daimko

URL内の他のパラメータの数に関係なく、aff=xのすべてのインスタンスを削除します。

他のURLパラメータを(任意の順序で)keepし、単純にaff=numberパラメータを削除すると仮定すると、ルートの.htaccessファイルでmod_rewriteを使用して次のようなことができます。

RewriteCond %{QUERY_STRING} ^(.*&|)aff=\d+(?:&(.*)|)$
RewriteRule (.*) /$1?%1%2 [R=302,L]

これは既存のWordPressディレクティブをbeforeする必要があります。

これはaffパラメータが存在する場合、それは数字と少なくとも1桁の値を持つことを前提としています。

$1は、キャプチャされたRewriteRulepatternへの後方参照です。ですから、これはあなたの例のように、ドキュメントのルートだけでなく、あらゆるURLパスを扱います。

%1%2は、前のCondPatternでキャプチャされたグループへの後方参照です。 %1before削除されるパラメータで、%2はafterです。どちらもオプションです。

302(一時的)リダイレクトを301(永続的)に変更します。これが正常に機能していることを確認した後でのみ(これが永続的であることを意図している場合)。


UPDATE#1: /クエリ文字列に%エンコード文字が含まれている

他のURLパラメータ(保持したいもの)にURLエンコード(%エンコード)値が含まれている場合は、NEnoescape)フラグをRewriteRuleディレクティブに追加して、これらの文字が二重にエンコードされないようにします。 置換。例えば:

RewriteRule (.*) /$1?%1%2 [NE,R=302,L]

QUERY_STRINGサーバー変数は、Apacheによって%デコードされていません。通常、mod_rewriteは応答をクライアントに返す前にsubstitutionをURLエンコードします。しかし、これはクエリ文字列からキャプチャしたエンコード済みの文字を二重にエンコードします。 NEフラグはこれが起こるのを防ぎます。


更新#2: 削除されるURLパラメータの値はanythingになります

この質問では、 "number"を含むaffというURLパラメータを削除することについて具体的に説明しました。一般に、正規表現を扱うときはできるだけ具体的にするべきですが、削除するURLパラメータにanythingを含めることができる場合は、CondPatternを次のように変更します。

  • ^(.*&|)aff=.*?(?:&(.*)|)$ - 欲張りでない0文字以上の一致。
  • ^(.*&|)aff=[^&]*(?:&(.*)|)$ - &(URL parameter delimiter)以外のものに0回以上一致します。

これらの両方の正規表現における重要な点は、マッチングされるvaluecaptureではないということです。普通の括弧で囲まないでください。

要約すれば:

RewriteCond %{QUERY_STRING} ^(.*&|)aff=[^&]*(?:&(.*)|)$
RewriteRule (.*) /$1?%1%2 [NE,R=302,L]
1
MrWhite