新しいWebサーバーで突然失敗するリダイレクト301を多数使用しています。
サイトを移行する前に、新しいWebサーバーで実稼働前のテストを行っていますが、一部のサイトは500内部サーバーエラーで失敗しています。データベースとファイルの両方のコンテンツが古いサーバーから新しいサーバーにミラーリングされるため、すべてのサイトが正しく機能するかどうかをテストできます。
この問題をmod_aliasのRedirectステートメントにトレースしました。これは、.htaccessから使用され、訪問者と検索エンジンを古いコンテンツから新しいページにリダイレクトします。
どうやらApacheサーバーは、宛先がプロトコルとホスト名を含む完全なURLである必要があります。
Redirect 301 /directory/ /target/ # Not Valid
Redirect 301 /main.html / # Not Valid
Redirect 301 /directory/ http://www.example.com/target/ # Valid
Redirect 301 /main.html http://www.example.com/ # Valid
これは矛盾しますApache 2.2のApacheドキュメント 、次のように述べています:
新しいURLは、スキームとホスト名で始まる絶対URLである必要がありますが、スラッシュで始まるURLパスも使用できます。その場合、現在のサーバーのスキームとホスト名が追加されます。
もちろん、古いサーバーと新しいサーバーの両方でApache2.2を使用していることを確認しました。古いサーバーはApache2.2.11を備えたGentooボックスですが、新しいサーバーはApache2.2.3を備えたRHEL5ボックスです。
回避策は、すべてのパスを完全なURLに変更するか、ステートメントをmod_rewriteルールに変換することですが、文書化された動作をお勧めします。
あなたの経験は何ですか?
この動作はApacheのバージョンとディストリビューションによって異なり、Apacheのドキュメントと矛盾しているようです(質問に記載されています)。とてもうるさい。どのバージョンがどの動作をサポートするかについての明確なパターンは見つかりませんでした。
RewriteRulesははるかに用途が広いので、すべてのリダイレクトを同様のRewriteRulesに書き換えると、読みやすさが犠牲になります。
Redirect 301 URL-path URL-path
が失敗した場合は、RedirectMatch 301 URL-path URL-path
を試すことができます。宛先として完全なURLがないRedirect
が500内部サーバーエラーをスローしていたサーバーで機能しました:非URLにリダイレクトします。
新しいWebサーバーのフルネームでリダイレクトを使用する必要があります。新しいWebサーバーは新しいサーバー上にあるため、古いサーバー上のApacheは、url-pathだけで移動するかどうかを判断できません。それが同じでない場合、どのマシンでホストされているかを伝える必要があります。
別の点を考慮する必要があります。古いwevserverは将来シャットダウンされますか?新しいサーバーが古いサーバーのDNS名を引き継ぎますか?
おそらく、すべてのWebサイトを新しいサーバーに移行した後、DNSを変更することを検討する必要があります。