web-dev-qa-db-ja.com

クエリ文字列でページをリダイレクトする方法は?

以下に示すように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 CodeRequest URIを確認しました。
私は何をすべきか?

3
Pasakgroup

代わりに次のようなものを試して、既存の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]

RewriteRulesubstitution(つまり、/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]

これは実際には何もしません。このディレクティブにはいくつかの問題があります(重大度の順に):

  • RewriteRulepatternは、URLパスのみに一致し、クエリ文字列を特に除外します。そのため、このパターンは決して一致しません。 (クエリ文字列を一致させるには、上記のようにRewriteCondディレクティブを使用して、QUERY_STRINGサーバー変数と照合する必要があります)。
  • フラグ引数の中央にスペースがあります。これにより、処理されると500内部サーバーエラーが発生します(「無効なフラグ」)。
  • QSD(クエリ文字列破棄)フラグは冗長です。
  • substitution(つまりターゲットURL)で同じクエリ文字列を繰り返す必要はありません。これはデフォルトで要求されたURLからそのままコピーされるためです。

したがって、RedirectMatch 410 ^/p1/p2&Redirect 410 ^/p1/p2&に変更しましたが、今回はリクエストURIの404コードを確認しました。

Redirectディレクティブとは異なり、RedirectMatchディレクティブは正規表現を受け入れないため、Redirect 410 ^/p1/p2&は何もしません。ただし、上記のように、これらのディレクティブはとにかく同じモジュール(mod_alias)に属しているため、これをRedirectに変更してもこの例では意味がありません。

「何も」発生していないため、404を取得している可能性があります。

1
MrWhite