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

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

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

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

Q&A

解決済

2回答

1459閲覧

301等のステータスコードを返さない転送で遷移先を知るには

coinbura

総合スコア106

PHP

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

0グッド

0クリップ

投稿2017/12/26 09:28

編集2017/12/26 14:18

PHPで転送URLの最終遷移先を取得する為の方法を探しています。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10136272930

上記方法で実装してた場合、301や302を返す転送URLの場合は、その最終遷移先を取得する事ができたのですが、そうでない場合(metaリフレッシュや.htaccessを利用等?)は取得できませんでした。

どうにかそれらも含めて取得する方法はないものでしょうか?

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

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

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

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

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

otn

2017/12/26 11:13

そうでない場合とは?ロケーションを遷移していないということでは?
coinbura

2017/12/26 11:37 編集

すみません。質問の意図と意味がよく分からないのですが、とりあえず、そうでない場合とは、括弧内にあるように「metaフラッシュや.htaccess等を利用」した場合の事です。 その他にも301や302を返さないものはあるとは思いますが、私が思いついたのはその2つだったので(^^A
otn

2017/12/26 11:48

30xを返していないと言うことは、遷移していないと言うことですが、なぜ遷移していると思ったのでしょうか?
coinbura

2017/12/26 11:55

実際にクリックすれば遷移するからです。
otn

2017/12/26 12:55

それはJavaScriptで別のページをリクエストし直してるのではないでしょうか。location.href="http://~"
CHERRY

2017/12/26 12:56

ちょっとイメージがわかないので、具体例を記載していただけないでしょうか。
otn

2017/12/26 12:59

「metaフラッシュ」って、もしかして、<meta http-equiv="refresh" content=~>のことですか?
coinbura

2017/12/26 13:18

あ!すみません!それです!metaリフレッシュの間違いでした(^^A
otn

2017/12/26 13:21

であれば、HTMLを見れば分かるのでは?
coinbura

2017/12/26 13:21 編集

具体例はここなんかがそうです。ttp://ck.jp.ap.valuecommerce.com/servlet/referral?sid=3154817&pid=884285959&vc_url=https%3A%2F%2Fwww3.lenovo.com%2Fjp%2Fja%2Fjptvc%2Fnotebooks%2Fideapad%2F300-series%2FLenovo-IdeaPad-320-15IKB%2Fp%2F88IP3000842%3Fcid%3Djp%3Aaffiliate%3A5Ts529%26
coinbura

2017/12/26 14:19

質問文がだいぶ分かりずらかったので修正しました。
guest

回答2

0

ベストアンサー

コメントに書きましたが、200でページが返って、metaやJavaSciptでページ遷移する場合は、HTMLソースやJavaScriptソースの解析が必要です。metaはともかくJavaScriptの解析は大変なので、ブラウザをコントロールする方法のプログラムにするのがいいと思います。

例えば、いくつかの言語で、Seleniumというライブラリがあって、これがIEやFirefoxなどをコントロールしてくれます。PHPにもあります。Selenium以外にもあったはずです。
cronからの起動などで、ブラウザ画面が出るのを抑止したい場合は、そのための「ヘッドレスブラウザ」という画面を持たないブラウザがあります。

投稿2017/12/27 00:48

otn

総合スコア84505

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

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

coinbura

2017/12/27 04:16

なるほど! 終始わけわからない事言ってすみませんでしたm(_ _)m そしてソースの解析は、metaのrefreshと、JavascriptのlocationのURLを取得すればいけるかなぁと思ったのですが、それだけじゃダメなんですね! Selenium、ヘッドレスブラウザ。貴重な情報ありがとうございます!! 勉強してみます!
otn

2017/12/27 06:49

JavaScriptの解析のためには、<script src="~">の場合は、別ファイルを取ってこないといけないです。 あと、まずないと思いますが、x=location; x["href"]="http://~"; という風なのを考慮するかどうか。
coinbura

2017/12/28 16:58

なるほど!別ファイルは確かにとってこないとですね! 後者は・・・まあ切り捨てていきたいと思います。 ご丁寧にありがとうございますm(_ _)m
guest

0

301等を返してないのであれば200を返してるとかそういうことではなくて?
ちなみにhtaccessで飛ばしても基本的にヘッダーは返ってきます。

何をしたくて遷移先を最後まで取りたいのか?が今回大事な気がします。

普通に考えればそもそも自サイト外へ転送された場合、細かく分かるのはその自サイト外のサーバーが何を返してきたかだけですよね?

otnさんが少しかかれてますが200が帰ってきたのならソースを取得してmetaで飛ばしてないかとか、javascriptのlocationで飛ばしてるとかそういうのを調べることになると思います。

それを自サイト内で追っかけていくことになるのではないでしょうか。
まぁそれだとクローラーの自作みたいな物になりそうなので私が質問の意味を間違えてるかもしれません。

投稿2017/12/26 16:33

landy77

総合スコア1614

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

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

coinbura

2017/12/26 17:01

ご回答ありがとうございます。 やりたい事は自作クローラーの作成です。 そして、まさしく301等を返すのではなく、200を返してくる感じです! なるほど、200が帰ってきた場合はソースを見るしかないのですね! となると、200が帰ってきた場合のみソースを取得してmeta refreshとjavascriptのlocationを探すプログラムを書けば良さそうですね。 ただ、それだと結局はすべての外部URLのソースを取得する事になっちゃうので、200で転送がかかってるかどうかを調べる術が欲しいところですが、難しそうですかね? htaccessに関しては勘違いしてました。 故意に指定しない限りは200等の転送になったりはしないんですね。
landy77

2017/12/26 23:27

ステータス200は「正常に取得できましたよ!」って言うコードですね。 意図的に301を返すって言うのはちゃんとした使い方としてはサイトが移転してますよ等(ドメインが変更になってます!って言うことを)をGoogle等に知らせて検索の評価を引き継いでもらうためにする物です(それだけじゃないですが大まかにはって事です 300番台は転送ですが301と302では意味が違いますから。 ですのでWEBブラウザみたいに全て(画像等)を取得せずにHTMLソースのみを取得してスクレイピングするのであればHTMLなんて結局テキストですので通常はせいぜい数KBですので取得してもサーバーへの負担などの影響は考えなくても良いと思います。 どっちにしてもクローラーを自作するのであればステータスコードが何を示しているのかは絶対に理解してないとまずいので(転送にも数種類あるので意味を理解してないと正しくクロールできない)そこをまずは理解する事をオススメします。
coinbura

2017/12/27 04:14

そうですよね。ステータスコードの理解は必須かと思います。 問題はそのルールを無視した転送をしているページの存在ですよね。 ステータスコードが200や404等で返ってくるのに転送がかかるページがなければいいんですけど… 上記のような場合でも「転送された事実」だけは何かしらの方法で簡単に取得できるのかなぁとか考えちゃってました(^^A 数KBとはいえ、ヘッダー情報だけとかに比べたらやはり格段に大きいので、ちょっとサーバーの変更を検討してます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問