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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

6119閲覧

file_get_contentsで自ホスト宛のURLが開けない

morimasa

総合スコア15

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/12/11 08:36

CentOS 7.2 + Plesk 12
の環境で作成したバーチャルホストの1つで、PHPアプリケーションを開発中です。

課題は、以下のようなシンプルなコードです。

PHP

1$rss = file_get_contents('http://example.com/feed'); 2var_dump($rss);

※example.comは、自ホストです。実際には違うドメインです。

これのfile_get_contentsの返り値がfalseになってしまうので、解消したいです。

なお、以下は、期待通りに文字列が返ってきて、動作します。

PHP

1$rss = file_get_contents('https://www.yahoo.co.jp/'); 2var_dump($rss);

ホストが違えば問題ありませんので、php.iniの設定等ではないようです。

さらに確認したところ、ドメイン名(ホスト名)が、自ホストの時にfalseになることが分かりました。

そこで、以下のような記事をいくつか見つけ、/etc/hostsを確認してみました。
http://q.hatena.ne.jp/1202255873
しかし、確認したところ、すでに自ホストのローカルアドレスの設定は存在するようでした。

127.0.0.1 example.com XXX.XXX.XXX.XXX example.com

※Xは実際には数字

念のため、コマンドラインからwgetを実行してみました。
結果は以下のようになりました。

[root@example ~]# wget http://example.com/magazine/feed --2017-12-11 16:37:38-- http://example.com/magazine/feed Resolving example.com (example.com)... 127.0.0.1, XXX.XXX.XXX.XXX Connecting to example.com (example.com)|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 404 Not Found 2017-12-11 16:37:38 ERROR 404: Not Found.

接続はできているが、404でした。
そこで、「example.com」のログを確認したところ、該当時刻にアクセスログはありませんでした。
さらに探したところ、デフォルトのログ(/var/log/httpd/access_log)にアクセスが出力されていました。

ということで、どうやら、
「自ホストを示すURLでアクセスしたとき、バーチャルホストの切り分けができず、デフォルトのドキュメントルートを参照している」
ということのようです。

調査方法を含め正しいのか不明ですが、こちらを解決できる(自ホスト内のバーチャルホストに対してHTTP経由で(url_fopenで)アクセスする)方法はありますでしょうか。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/12/11 08:50

「127.0.0.1 example.com」をやめて、wgetで参照すればとれるのでしょうか?
退会済みユーザー

退会済みユーザー

2017/12/11 13:28

バーチャルホスト(httpd-vhost.conf 等)の設定はどうなってるんだろう
morimasa

2017/12/11 14:52 編集

「127.0.0.1 example.com」をやめて、wgetを実行すると、とれました。そして、その変更をhostsに入れた状態で、Webアプリの方も動作しました。ですので、これでもう回答ですね。。ありがとうございます。このままだとベストアンサーなど選べないので、お手数ですが、改めて「回答」していただければと思います。
morimasa

2017/12/11 14:55 編集

httpdのconfigについては、全てPleskの設定画面経由ですので、バーチャルホストの設定も、Pleskのデフォルトままです。PleskのApacheのconfigの構造は、そこそこ複雑なので、完全な内容把握は難しく、できればお手元のPlesk12環境で確認いただければと思います。。。が、おかげさまで問題自体は解決しました。
yambejp

2017/12/12 01:56

解決したみたいなので、ご自身で結果だけ回答をつけて閉じてもらえば結構です
guest

回答1

0

自己解決

/etc/hostsにあったローカルIPへの記述(以下)からexample.comを消去することで、動作するようになりました。

127.0.0.1 example.com

結果的に残った

XXX.XXX.XXX.XXX example.com

でアクセスされることで、きちんとバーチャルホストの通りのドキュメントルートを参照されるようになったようです。

つまり、
(少なくともPleskデフォルトでは)ループバックアドレスでアクセスされたときには、バーチャルホストが効かない
ということのようです。

ありがとうございました。

投稿2017/12/12 03:05

morimasa

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問