以下に示すようにRedirect
したい:
https://example.com/p1/p2?sort=p.model&order=ASC&page=2
に
https://example.com/p3/p4?sort=p.model&order=ASC&page=2
また、.htaccess
ファイルにこのコードがあります:
RedirectMatch 410 ^/p1/p2&
以下のコードを使用しましたが、そのURLの410 code
が表示されます。
RewriteRule ^/p1/p2?sort=p.model&order=ASC&page=2$ /p3/p4?sort=p.model&order=ASC&page=2 [QSD, R=301,L]
そのため、RedirectMatch 410 ^/p1/p2&
をRedirect 410 ^/p1/p2&
に変更しましたが、今回は404 Code
のRequest URI
を確認しました。
私は何をすべきか?
代わりに次のようなものを試して、既存のRedirectMatch
ディレクティブを置き換えます。
RewriteEngine On
# Redirect "/p1/p2?sort=p.model&order=ASC&page=2" and keep query string
RewriteCond %{QUERY_STRING} ^sort=p\.model&order=ASC&page=2$
RewriteRule ^p1/p2$ /p3/p4 [R=302,L]
# Reject all requests that start "/p1/p2&" with 410 Gone
RewriteRule ^p1/p2& - [G]
RewriteRule
substitution(つまり、/p3/p4
)でクエリ文字列を繰り返す必要はありません。要求されたURLからのクエリ文字列はデフォルトで変更されずに通過するためです(明示的にsubstitutionにクエリ文字列を設定しない場合)。
これは302(一時)リダイレクトであることに注意してください。これが永続的であることが意図されている場合は301に変更しますが、それが正常に機能していることを確認した後にのみ。テストする前にブラウザのキャッシュをクリアしてください。
以下のコードを使用しましたが、そのURLのコードは410だけです
「何か他のもの」がこれを引き起こしていない限り、410応答が表示された理由は不明です。既存のRedirectMatch
ディレクティブは一致しないはずです。
ただし、mod_alias(RedirectMatch
およびRedirect
)とmod_rewrite(RewriteRule
)ディレクティブを混在させないでください。予期しない競合が発生する可能性があります。異なるモジュールは、リクエスト中に独立して異なる時間に実行されます。そのため、以前のRedirectMatch
ディレクティブがリクエストを書き換えた場合でも、Redirect
(またはRewriteRule
)ディレクティブがまだ処理されていることがわかります。
RewriteRule ^/p1/p2?sort=p.model&order=ASC&page=2$ /p3/p4?sort=p.model&order=ASC&page=2 [QSD, R=301,L]
これは実際には何もしません。このディレクティブにはいくつかの問題があります(重大度の順に):
RewriteRule
patternは、URLパスのみに一致し、クエリ文字列を特に除外します。そのため、このパターンは決して一致しません。 (クエリ文字列を一致させるには、上記のようにRewriteCond
ディレクティブを使用して、QUERY_STRING
サーバー変数と照合する必要があります)。QSD
(クエリ文字列破棄)フラグは冗長です。したがって、
RedirectMatch 410 ^/p1/p2&
をRedirect 410 ^/p1/p2&
に変更しましたが、今回はリクエストURIの404コードを確認しました。
Redirect
ディレクティブとは異なり、RedirectMatch
ディレクティブは正規表現を受け入れないため、Redirect 410 ^/p1/p2&
は何もしません。ただし、上記のように、これらのディレクティブはとにかく同じモジュール(mod_alias)に属しているため、これをRedirect
に変更してもこの例では意味がありません。
「何も」発生していないため、404を取得している可能性があります。