web-dev-qa-db-ja.com

リダイレクト301は、パスを宛先として失敗します

新しい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ルールに変換することですが、文書化された動作をお勧めします。

あなたの経験は何ですか?

1
Martijn Heemels

この動作はApacheのバージョンとディストリビューションによって異なり、Apacheのドキュメントと矛盾しているようです(質問に記載されています)。とてもうるさい。どのバージョンがどの動作をサポートするかについての明確なパターンは見つかりませんでした。

RewriteRulesははるかに用途が広いので、すべてのリダイレクトを同様のRewriteRulesに書き換えると、読みやすさが犠牲になります。

1
Martijn Heemels

Redirect 301 URL-path URL-pathが失敗した場合は、RedirectMatch 301 URL-path URL-pathを試すことができます。宛先として完全なURLがないRedirectが500内部サーバーエラーをスローしていたサーバーで機能しました:非URLにリダイレクトします。

1

新しいWebサーバーのフルネームでリダイレクトを使用する必要があります。新しいWebサーバーは新しいサーバー上にあるため、古いサーバー上のApacheは、url-pathだけで移動するかどうかを判断できません。それが同じでない場合、どのマシンでホストされているかを伝える必要があります。

別の点を考慮する必要があります。古いwevserverは将来シャットダウンされますか?新しいサーバーが古いサーバーのDNS名を引き継ぎますか?

おそらく、すべてのWebサイトを新しいサーバーに移行した後、DNSを変更することを検討する必要があります。

0
Christian