私の.htaccess
には以下の行があります(他にも行がありますが、この2つは互いに隣接しています)。
RedirectMatch 301 ^/datingstories https://example.com/blog/category/relationships/datingstories/
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1
/blog
の下)と、WordPressの外部で作成されたメンバーシップおよびプロフィールページがあります。https://example.com/datingstories
はブログの日付のサブカテゴリに変換されます。これは外部的にも共有されています(だからこそ私はもっと短いURLを望んでいたのです)sitename/showprofile.php?username=username
に変換します。サイトにメンバープロフィールページがあり、URLが簡略化されています(つまり、https://example.com/frank
はhttps://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が表示されれば素晴らしいでしょう。
これを見て対応するのにあなたの時間を感謝します。
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 RedirectMatch
redirects URL(RedirectMatch
がリクエスト内のURLと一致する場合、プロセス全体が2回目のパスから開始されます。書き換えられたURLではありません。したがって、これは/datingstories
ではなくshowprofile.php
に一致します-書き換えられたURL)。これにより、書き換えられたURLパス(showprofile.php
)は置き換えられますが、クエリ文字列(?username=dating
)は保持されます。 (ただし、投稿したディレクティブからは明確ではありません。URLパラメーターでdatingstories
がdating
に切り捨てられる理由-他のディレクティブと競合する可能性があります。)以前の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
フラグを無視しないでください-必要に応じて、さらなる処理(ファイルの現在のパス)を停止します。