web-dev-qa-db-ja.com

RedirectMatchとRedirectが互いに干渉している

私の.htaccessには以下の行があります(他にも行がありますが、この2つは互いに隣接しています)。

RedirectMatch 301 ^/datingstories https://example.com/blog/category/relationships/datingstories/
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1
  • サイトへのWordPressブログコンポーネント(/blogの下)と、WordPressの外部で作成されたメンバーシップおよびプロフィールページがあります。
  • 1行目は、サブカテゴリ内の特定のブログセットにアクセスするためのより簡単な方法です。つまり、https://example.com/datingstoriesはブログの日付のサブカテゴリに変換されます。これは外部的にも共有されています(だからこそ私はもっと短いURLを望んでいたのです)
  • 2行目は、サイト名/ユーザー名をsitename/showprofile.php?username=usernameに変換します。サイトにメンバープロフィールページがあり、URLが簡略化されています(つまり、https://example.com/frankhttps://example.com/showprofile.php?username=frankにリダイレクトされます)。ただし、ブラウザのURLにhttps://example.com/frankが表示されている

問題はhttps://example.com/datingstoriesがクリック/リンクされている場合、結果のURLはhttps://example.com/blog/category/relationships/datingstories/?username=datingです

ページがまだロードされている間、?username=datingが結果のURLの一部として表示されないようにする方法はありますか。私は2番目の.htaccessルールが適用されていると思いますが、結果のURLにshowprofile.phpが表示されないため、どうしたらよいかわかりません。

また、理想的には、結果のページに長いURLではなく短いURLが表示されれば素晴らしいでしょう。

これを見て対応するのにあなたの時間を感謝します。

2
E.Hoh

RedirectMatchとRedirect相互干渉

あなたが与えた例では、RedirectMatch(mod_alias)とRewriteRule(mod_rewrite)はRedirectではなく、「互いに干渉している」。 Redirectはmod_aliasディレクティブであり、動作しますwithRedirectMatch-したがって、このように競合することを必ずしも期待する必要はありません。

上記のように、RewriteRuleはmod_rewriteディレクティブですが、RedirectMatch(およびRedirect)はmod_aliasディレクティブです。 .htaccessファイル内の見かけ上の順序に関係なく、異なるApacheモジュールは、リクエスト中に独立して異なる時間に実行されます。 mod_aliasおよびmod_rewriteの場合、mod_rewriteは常にfirstを実行します。

したがって、あなたの例では、RewriteRule(2番目のディレクティブ)が処理されます先行するRedirectMatchディレクティブ-両方ともURL /datingstoriesと一致するためです。その後、ファイルを介して処理が続行され、最初のmod_alias RedirectMatchredirects URL(RedirectMatchがリクエスト内のURLと一致する場合、プロセス全体が2回目のパスから開始されます。書き換えられたURLではありません。したがって、これは/datingstoriesではなくshowprofile.phpに一致します-書き換えられたURL)。これにより、書き換えられたURLパス(showprofile.php)は置き換えられますが、クエリ文字列(?username=dating)は保持されます。 (ただし、投稿したディレクティブからは明確ではありません。URLパラメーターでdatingstoriesdatingに切り捨てられる理由-他のディレクティブと競合する可能性があります。)以前のrewriteは、301 HTTPステータスが適用された後に外部リダイレクトに変換されます。

ここでの教訓は、このような混乱を避けるために、両方のモジュールからredirects/rewritesを混在させないことです。 WordPressはフロントコントローラーにmod_rewriteを使用するため、理想的にはmod_rewriteを全体で使用します。したがって、mod_alias RedirectMatch(およびRedirect)ディレクティブを変換して、代わりにmod_rewrite RewriteRuleを使用する必要があります。

例えば:

RewriteRule ^datingstories /blog/category/relationships/datingstories/ [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1 [L]

Lフラグを無視しないでください-必要に応じて、さらなる処理(ファイルの現在のパス)を停止します。

0
MrWhite