web-dev-qa-db-ja.com

301リダイレクトURLからクエリ文字列を削除します

リダイレクトに問題があり、これを機能させることができませんでした。次のものを作りたい

http://www.example.com/seasonal/christmas?p=15

にリダイレクト

http://www.example.com/holiday-decor/christmas.html

リダイレクトされたURLにクエリ文字列が表示されないように、誰かが書き換えルールを手伝ってくれるかどうか疑問に思っていました。 Magentoプラットフォームサイトで。htaccessを使用しています。

4
mrblo0m

デフォルトでは、リクエストされたURLのクエリ文字列は、書き換えられた/リダイレクトされたURLに追加されます。

Apache 2.4以降QSDディレクティブでRewriteRule(クエリ文字列破棄)フラグを使用して、discardからのクエリ文字列をリダイレクトされたURL。例えば:

RewriteCond %{QUERY_STRING} =p=15
RewriteRule ^seasonal/christmas$ /holiday-decor/christmas.html [QSD,R=301,L]

RewriteCondディレクティブは、要求されたURLのクエリ文字列部分と一致するために必要です。 (RewriteRuleパターンと一致するURLはURLパスのみです。これは、クエリ文字列を特に除外します。)CondPattern==p=15プレフィックスは、 (正規表現ではなく)リテラルの「文字列」の一致。したがって、p=15と完全に一致します。

Apache 2.2以前では代わりに、RewriteRule置換の最後に?を追加して、クエリ文字列を削除する必要があります。これは本質的に空白クエリ文字列を書き込みます(?は実際にはリダイレクトされたURLの一部にはなりません)。 substitution stringにクエリ文字列を追加すると、リクエストのクエリ文字列が上書きされることに注意してください。 (この状況で元のクエリ文字列も追加する必要がある場合は、QSAフラグ-Query String Append-が必要ですが、それ以外の場合、このフラグは不要です。)

たとえば、Apache 2.2では、上記のRewriteRuleディレクティブを次のように変更します。

RewriteRule ^seasonal/christmas$ /holiday-decor/christmas.html? [R=301,L]

注意:?の追加はApache 2.4でも機能します。ただし、QSDフラグを使用することをお勧めします。 2つの方法は同じではありません。

4
MrWhite