私は自分の質問についていろいろ調べました。似たようなものはいくつかありましたが、私の問題を解決できるものはありませんでした。
次のように終わるすべての 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) ことを示しています。これは、QSD
Apache 2.4 (使用していると想定します) の新機能です。フラグを省略するとQSD
、リダイレクト ループが発生します (クエリ文字列がリダイレクトされた URL に再度追加されるため)。
上記はクエリ文字列と一致していることに注意してくださいその通り(あなたの例のように) クエリ文字列に他の URL パラメータがある場合、または大文字と小文字が異なる場合は、一致しません。
これは 302 (一時的) リダイレクトであることに注意してください。正常に動作することを確認した後、意図している場合にのみ 301 (永続的) に変更してください。301 はブラウザによって永続的にキャッシュされるため、テストが問題になる可能性があります。
参照: