PHPの質問です。


複数のページからなるサイトで、あるページから他のPHPファイルで
一律の処理をしたあと、またもとのページに戻る処理をしたいと
思います。下記方法で実現はできないのでしょうか。

A.php
---------
<?
!!do something!!
$referer = $_SERVER[’HTTP_REFERER’];
if referer = "" {
header("Location: (TOPのURL)");
} else {
header("Location: $referer");
?>
-------

あるいは、元のページのリンクを
<a href="A.php?url=back.php>
みたいにして、
header("Location: $url");
するとか・・・(ページが100ページぐらいあるので
back.phpの名前はPHPで自動的にとらないと難しいですが。)

そんなことは実現できますでしょうか?
PHPのソースも教えてもらえると助かります。

※そのPHPは外部ファイルにする必要があります。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/01/17 06:38:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:yoneto164 No.1

回答回数813ベストアンサー獲得回数94

ポイント35pt

PHPで取得できるリファラは1ページ前だけなので、

処理を終えた先のページから見ると2つ前になってしまい取得でないと思います。

処理をするページ(以下ではregister.php)にてリファラを取得し、

form タグ内に hidden フィールドを設けて戻るURLを受け渡すというのはどうでしょうか。


register.php

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>ここで何らかの処理をします</p>
<?php
$ref = $_SERVER['HTTP_REFERER'];
?>
<p>リファラである <?= $ref ?> も変数として同時に送信します</p>
<form method="post" action="refresh.php">
<input name="ref" type="hidden" value="<?= $ref ?>">
<input type="submit" value="送信">
</form>
</body>
</html>

refresh.php

<html>
<head><meta http-equiv="refresh" content="1;URL=<?= $ref ?>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
もとのファイル <a href="<?= $ref ?>"><?= $ref ?></a> へ1秒後にジャンプします
</body>
</html>

という2つのファイルを同じディレクトリに配置し、

任意のURLから register.php にリンクを張ってアクセスしたあと、

「送信」ボタンを押すともとのURLにリダイレクトされます。

このような方法ではいかがでしょうか。

id:kanshizm

すいません。実は下のコメントにあるように解決しています。

ただ、普通は

$ref = $_SERVER['HTTP_REFERER'];

でリファラ取得できますよね。。私の場合はできなかったものですから・・・。

ウィルスソフトも切って実験してみたのですが、だめでした。

ちなみに質問文の!!DO SOMETHING!!ですが、クッキー関係の処理

なので、何かを出力することはありませんので、上記だとregiresh.phpを

使うことなく実現できるような気がしています。

いずれにしても他の人も見ているようですので、新たな考えを

ありがとうございました。<(m_m)>

引き続きb-windさんの回答お待ちしています。

2008/01/13 17:01:48
id:so-asano No.2

回答回数40ベストアンサー獲得回数5

ポイント35pt

> refererの方はうまくどうしてもうまくいかなかったので

php.ini の設定、php のバージョンによって異なるけど、いちばんありがちなのは $_ENV['HTTP_REFERER'] じゃないかなぁ。getEnv("HTTP_REFERER") なら確実かも。

  • id:b-wind
    そんな感じでだいたいできるはずです。
    むしろどこがわからないのかが聞きたい。
  • id:kanshizm
    id:b-windさん
    ありがとうございます。

    refererの方はうまくどうしてもうまくいかなかったので、下の
    引数のやり方で実現できました。ポイント差し上げたいので
    何か適当に回答を入れてもらってもよろしいでしょうか。

    ウオッチリストの方が何名かいるのでソースを書いておきます。

    元ファイル
    echo '<a href="処理ファイル.php?backurl='.$_SERVER['SCRIPT_NAME'].'">処理する</a>';

    処理ファイル
    <?php
    !! 処理 !!
    $backurl = "Location: http://www.exsample.com".$_GET['backurl'];
    header ($backurl);
    ?>
  • id:tezcello
    HTTP_REFERER は、常に得られる値ではなかったと記憶しています。
    ブラウザによって(あるいは、設定などによって、またはproxy 経由でも)得られない場合もあるようで...
  • id:t_shiono
    この辺りが参考になりますでしょうか?

    http://blog.naggg.jp/2007/06/ie-fucking-referrer-spec.html

    あとは、セッション中に一つ前のページのURLを持っておくのも手軽かもしれません。
    ユーザ側には見えないですし、ちょっと工夫すれば、全てのページに

    $_SESSION['prev_url'] = $_SERVER['REQUEST_URI'];

    みたいなことを書いておけばよいので。
    共通でインクルードするファイルがあれば、そこに書いとくともっとお手軽です。

    REFERERはようばブラウザの自己申告みたいなものですが、REQUEST_URIはサーバ側で埋めてくれるものなので、取得できないということはないでしょう。

    何かの参考になれば。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません