htaccessは疑問符パラメータを持つすべてのURLを疑問符なしでリダイレクトします

htaccessは疑問符パラメータを持つすべてのURLを疑問符なしでリダイレクトします

私は自分の質問についていろいろ調べました。似たようなものはいくつかありましたが、私の問題を解決できるものはありませんでした。

次のように終わるすべての URL を永続的にリダイレクトする必要があります。

?mode=list

そして

?mode=grid

なし(疑問符とその後の文字を削除)

例:

example.com/random-url-here?mode=grid redirect to example.com/random-url-here

そして

example.com/whatever-url-here?mode=list redirect to example.com/random-url-here

私はこれを試しました:

RewriteEngine on 
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1

この

RewriteEngine on 
RewriteRule (.*)$^mode=list $1 [L,R=301]
RewriteRule (.*)$^mode=grid $1 [L,R=301]

しかし、うまくいきません。明らかに、これがどのように機能するのか理解できません。助けてください。

ありがとう

答え1

example.com/random-url-here?mode=grid

URLの最初の部分?mode=gridこの例では)の後の部分はクエリ文字列

RewriteRule (.*)$^mode=list $1 [L,R=301]

ディレクティブはRewriteRule最大 3 つの引数を取ります。

RewriteRule pattern substitution [flags]

パターンディレクティブの(最初の引数)は、RewriteRule要求された文字列に一致する正規表現(regex)です。URLパスのみ、これはクエリ文字列を除外します。したがって、RewriteRuleディレクティブを使用してクエリ文字列を一致させることはできません。

クエリ文字列を一致させるには、追加のRewriteCond(条件)ディレクティブを使用してQUERY_STRINGサーバー変数をチェックする必要があります。RewriteCondディレクティブは適用されます条件RewriteRule後続の指令に従ってください。

しかし、正規表現は(.*)$^mode=list(クエリ文字列の一致を試みることを除いて)一度もないこのコンテキストでは一致します。$行末をアサートし、^行頭をアサートするため、これは常に失敗します。

上記の例では、$1後方参照(置換文字列)はURLパスに一致しようとしています。しかし、このURLパス(ディレクトリ文脈上、つまり.htaccess) はスラッシュで始まっていません (つまり相対的RewriteBase)なので、ファイル内の他の場所にディレクティブを定義しない限り、不正なリダイレクトが発生します.htaccess相対的置換文字列は、ファイルを含むディレクトリを基準としたファイルシステム パスとして表示されます.htaccess

Rこのコンテキストで( ) フラグを省略するとredirect(最初の例のように)、リクエストを内部的に書き換えようとする (外部にリダイレクトしない) ため、表示される URL は変更されません。

代わりに、ルート ファイルの先頭付近で次のコードを試してください.htaccess

RewriteEngine On

RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]

上記は、(.*)クエリ文字列がmode=listまたはmode=grid(正確に) であるすべての URL について、同じ URL パスにリダイレクトし、クエリ文字列を破棄する ( QSD- Query String Discard) ことを示しています。これは、QSDApache 2.4 (使用していると想定します) の新機能です。フラグを省略するとQSD、リダイレクト ループが発生します (クエリ文字列がリダイレクトされた URL に再度追加されるため)。

上記はクエリ文字列と一致していることに注意してくださいその通り(あなたの例のように) クエリ文字列に他の URL パラメータがある場合、または大文字と小文字が異なる場合は、一致しません。

これは 302 (一時的) リダイレクトであることに注意してください。正常に動作することを確認した後、意図している場合にのみ 301 (永続的) に変更してください。301 はブラウザによって永続的にキャッシュされるため、テストが問題になる可能性があります。

参照:

関連情報