質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.83%

301 Moved Permanently 時の転送先がIPアドレスになる

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 4,141

Fujihara

score 7

一般的にWEBアクセス時のURLでディレクトリの最後のスラッシュをつけないでアクセスした際、自動的にスラッシュ付のURLに転送されるようになっていると思います。

自動転送時に発生しているレスポンスを見たところ、以下のようになっていました。

HTTP/1.1 301 Moved Permanently
Date: Tue, 29 Nov 2016 01:48:58 GMT
Server: Apache
Location: http://www.xxxxxxxx.com/news/
Content-Length: 236
Content-Type: text/html; charset=iso-8859-1
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://aaa.bbb.ccc.ddd:80/news/">here</a>.</p>
</body></html>

httpd.conf の ServerNameディレクティブには www.xxxxxxxx.com を設定してあって、ヘッダ部の Location では正しくホスト名が表示されているのですが、本文内の転送先URLがIPで表示されてしまっている状況です。

いろいろ他の設定を見てみましたが、なぜこのように出るのか、どこの設定で修正できるか教えていただけませんでしょうか。
Server version: Apache/2.2.xx (CentOS)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

IPアドレスaaa.bbb.ccc.dddは間違いなく www.xxxxxxxx.comのものなのでしょうか?
ReverseProxyで別のサーバーが返していたりしませんか?
で、Locationヘッダーはきちんとケアされwww.xxxxxxxx.comになるが 301のresponse bodyはケアされずそのままとか。

強引ですが、www.xxxxxxxx.comの httpd.conf で SubStituteモジュールを使用しresponce bodyの//aaa.bbb.ccc.ddd///www.xxxxxxxx.com/に置き換えることが可能です。
(ただし置換処理が常に入るので使用しない場合に比べてサーバーリソースを食います)

Substitute s|//aaa.bbb.ccc.ddd/|//www.xxxxxxxx.com/|f


ただし問答無用で置き換えるので//aaa.bbb.ccc.ddd/という文字列をレスポンスとして返したい場合でも置き換えられてしまいます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 14:00

    ServerNameディレクティブは確認済みでした。それがヘッダ部の Location: に表れてました。
    しかしボディ側はどうやら異なるみたいです。

    キャンセル

  • 2016/11/29 14:04 編集

    「ServerNameディレクティブ」はReverseProxyしている先のwebサーバー(apache?)の設定ですよ? IPアドレスの response bodyを出力しているのはReverseProxyしている先のwebサーバーなので。

    キャンセル

  • 2016/11/29 14:14

    失礼しました!
    となりますと、やはりリバースプロキシサーバ側に依頼するしかないということですね...

    ありがとうございました。リバースプロキシの方は触る権限を持っていないので、一旦対応できるか依頼してみようと思います。

    とても詳細にご確認いただき助かりました。
    ありがとうございました。

    キャンセル

0

301のレスポンスが返ってくるということは、サーバ側で301 Moved Permanentlyの設定がされているという事です。
それと「WEBアクセス時のURLでディレクトリの最後のスラッシュをつけない」と言うのは、直接関係しません。

301を返してきたURLについて、ブラウザは転送先(次にアクセスするときに使うURL)の情報を保存します。
そして、同じURLへのアクセスがあった場合には、保存しておいた情報を用いて転送先に直接アクセスします。
ブラウザで保存している情報がホスト名ではなくIPアドレスになっているのは、何度もホスト名からIPアドレスへの変換をしなくて済む(その分、アクセスにかかる時間を短縮できる)ためだと思います。このあたりはブラウザの設計思想や実装に関わるところなので、ブラウザの種類やバージョンによって違いがあるだろうと思います。
ブラウザで起こる事ですから、サーバの設定であるhttpd.confは直接関係しません。(httpd.confに書かれた通りの転送先URLが301のレスポンスとしてブラウザに届いているはず。でも、それをブラウザがどう扱うかをhttpd.confで制御する事は無理)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 12:01 編集

    ご回答・ご説明ありがとうございます。
    おおよそ理解はできるのですが、このサーバ以外で同様のレスポンスを見たところでは、Locationに記されたものと同じbodyが出力されております。
    サーバからのレスポンスを見てますのでブラウザは関係ないかと。。。

    キャンセル

0

Apache は分かりませんが、IIS では終了スラッシュのないフォルダが要求されると自動的にリダイレクトされます。

[IIS] 終了スラッシュのないフォルダが要求されると自動的にリダイレクトされる
https://support.microsoft.com/ja-jp/kb/298408

Apache も同じことではないかと・・・

何にせよブラウザは関係なくて、Web サーバーの仕様・設定によるはずです。

ちなみに IIS7 では、例えば、http://surferonwww.info/BlogEngine(BlogEngine はフォルダ)という要求をかけると 301 応答が返ってきて、ヘッダの Locaton、コンテンツの a 要素の href 属性とも IP ではなく、以下の通りホスト名になります。

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: http://surferonwww.info/BlogEngine/
X-Powered-By: ASP.NET
Date: Tue, 29 Nov 2016 03:25:18 GMT
Content-Length: 236

<head>
<title>ドキュメント移動</title>
</head>

<body>
<h1>オブジェクトは移動しました</h1>
このドキュメントは<a HREF="http://surferonwww.info/BlogEngine/">ここ</a>で見つかる可能性があります
</body>

質問者さんの Web サーバーの場合、何故コンテンツの a 要素の href 属性が IP アドレスになるのかは分かりませんが、ブラウザは 301 応答を受けると直ちにヘッダの Location に指定された URL を GET 要求に行くので、そのままで実害はなさそうですが?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 12:49

    ありがとうございます!
    やはりWebサーバー仕様ですよね...

    もちろん、現状でも正常動作しており実害があるわけではないのですが、サーバーの内部IPが外部に出てしまうのが嫌でセキュリティ上隠したいということなのです。
    これは、Apacheではなく OS側の設定もしくはNetwork攻勢を疑った方がいいのか判断がつかず。。。

    ただ、IISでの出方も基本的には同じようなので、やはりWebサーバプログラムかな、、、と。
    apacheだとmod_dirモジュールがこれを処理してるようなのですが、これに関する設定方法等に関するドキュメントが見つけられません。

    簡単に言えば、301のレスポンスになっているテンプレートが分かれば。。。というところかも知れません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る