
ApacheのURLリダイレクトができない原因と解決方法を現役エンジニアが解説
こんにちは、takaraです。
サブドメインサイトの閉鎖にあたり、URLリダイレクト設定をしようとしてハマってしまったので、
その共有を、自戒の意味も兼ねて。
SSL設定を省いた類似環境で、状況再現を含めて紹介します。
Apacheのリダイレクト設定方法について
Apacheのリダイレクトがされなかった状況
[環境] CentOS 6.10 Apache 2.2.15 [関連Webバーチャルホスト] new.example.com ... リダイレクト先 old.example.com ... 閉鎖予定のリダイレクト元
動作確認
旧サイト閉鎖に伴う、新サイトへのリダイレクト設定を依頼され、対応に着手しました。
この時点では、DocumentRoot直下に .htaccessファイルを配置して設定すると消える(消される)かもしれないし、しばらくバーチャルホスト設定を残し、そのバーチャルホスト設定ファイル内でリダイレクト設定を書こう、という考えで進行。
Apacheのリダイレクト元サイトのバーチャルホスト設定ファイルにおいて、
DocumentRootと同ディレクトリのDirectoryディレクティブに、2行、リダイレクト関連の内容を追記。
# vi /etc/httpd/conf.d/old.example.com.conf

# /usr/sbin/httpd -t Syntax OK # service httpd reload
http://old.example.com にアクセスしてもリダイレクトされない。。

書き方がおかしいのか、単純なRedirectの記述に切り替えて、改めて動作を確認。

この書き方だと動作するものの、ディレクトリやファイルの指定を保持したままのリダイレクトになってしまいました。
http://old.example.com/ → http://new.example.com/ http://old.example.com/img/test.jpg → http://new.example.com/img/test.jpg
旧サイトと新サイトのディレクトリ構成やファイル名が同一である保証はないので、この設定状況は望ましくない。
全アクセスを “http://new.example.com/” トップページに流すための試行錯誤を始めました。
# vi /etc/httpd/conf.d/old.example.com.conf # httpd -t Syntax OK # service httpd reload # vi /etc/httpd/conf.d/old.example.com.conf # httpd -t Syntax OK # service httpd reload # vi /etc/httpd/conf.d/old.example.com.conf # httpd -t Syntax OK # service httpd reload # vi /etc/httpd/conf.d/old.example.com.conf # httpd -t Syntax OK # service httpd reload ・ ・ ・
すぐに望むようには動かなかったので、設定やコンテンツ構成を全体的に見直すことに。

AllowOverride All
htaccessファイルでの設定上書きが可能になっていました。htaccessファイルの存否を確認します。
# find /var/www/old.example.com -type f -name .htaccess /var/www/old.example.com/.htaccess # cat /var/www/old.example.com/.htaccess

Oh…
条件的には、リクエストのHOSTヘッダの頭が “old.example.com” でない場合、”http://old.example.com” に ディレクトリやファイルの指定を保持した状態でリダイレクト、といった内容です。
全てのアクセスをリダイレクトさせるApacheのconfファイル内のルールと競合しないようには見えますが、そちらのRewriteRuleは効きません。
DocumentRoot直下のhtaccessファイルに同ルールを記述してみます。

ディレクトリやファイルの指定を保持せずにリダイレクトする、望む動作をするようになりました。
http://old.example.com/ → http://new.example.com/ http://old.example.com/img/test.jpg → http://new.example.com/
追加ルールの位置を変えても、変わらずに望んだ動作をします。

Apacheのconfファイルに記載のRewrite関連ディレクティブが、htaccessファイルのRewrite関連ディレクティブ内容で上書きされている、といった状況が確認できます。
まとめ
Apache設定ファイルと、htaccessでの同ディレクティブの設定上書きには気を付けて運用しましょう。
Apacheに限ったことではありませんが、設定ファイルが分散しすぎると管理・運用が煩雑になるので注意が必要です、と苦しい言い訳で締めくくって、今回の自戒を終了とします。
ではまた。
ネットアシストの関連サービス
ネットアシストの関連サービスを以下よりご覧いただけます。
導入の参考にご覧ください。