スレッド表示 | フラット表示〕 全トピック 920 件中 390 番目 次≫ ≪前

携帯でアクセス元を確認したいのですが・・・。

created: 2005-08-09 19:56 | modified: 2005-08-13 18:52 | reply: 14

[2439] 携帯でアクセス元を確認したいのですが・・・。

user: ちひろ | created: 2005-08-09 19:56
初めまして。ちひろと申します。
私は今携帯サイトを作成しているのですがなにしろこの携帯サイトを作ると同時にPHPに触れ始めたものですから、PHPに関する知識がまったくありません。
そのためやりたいことがなかなかやれません。
そこで皆さんのお力をお借りしたく書き込みをさせて頂きました。
早速質問なんですが、タイトルにある通り携帯でアクセス元を確認してアクセス制限をかけることは可能でしょうか?

やりたいことを簡単に書きますと、例えば

グーグルにリンクしてあるがそのままクリックするとエラーページを表示し、一度同じページ内にあるヤフーのリンクをクリックしてバックボタンで戻ってからグーグルリンクをクリックするとグーグルにアクセスが可能になる。

というようなことが出来るでしょうか?

過去ログに
(ここから引用)
アクセス元のスクリプトで、
セッション変数に特定の文字列を保存しておき
アクセス先で、その変数の値をチェックして
正しければ文字列を破棄して普通に表示し、
文字列が無いか違っていれば、警告メッセージを出すようにします。
(ここまで引用)
というものがありましたが詳しい方法が書かれていませんでした。

ですので詳しい方法まで書いていただけるとありがたいです。
ちなみに携帯用でよろしくです。
reply: 2443 返信 編集 削除

[2443] Re. 携帯でアクセス元を確認したいのですが・

user: ゆうじ | created: 2005-08-10 17:23
こんばんわ。

> アクセス元のスクリプトで、
> セッション変数に特定の文字列を保存しておき
> アクセス先で、その変数の値をチェックして
> 正しければ文字列を破棄して普通に表示し、
> 文字列が無いか違っていれば、警告メッセージを出すようにします。

これをそのままコードにするとこうなります。

test1.php (アクセス元のスクリプト)
<?php
session_start();
$_SESSION['CheckStr'] = 'test1';
?>
<html>
<head>
</head>
<body>
<p>
このページを通らない限り先に進めません。
</p>
</body>
</html>

test2.php (アクセス先のスクリプト)
<?php
session_start();
if ($_SESSION['CheckStr'] == 'test1') {
unset($_SESSION['CheckStr']);
$message = 'Good!正規ルートで来ましたね';
} else {
$message = 'Bad!直接飛んできちゃダメよ';
}
?>
<html>
<head>
</head>
<body>
<p>
<?php echo $message; ?>
</p>
</body>
</html>

これで test1.php を通らない限り
test2.php では警告メッセージが表示されます。
この応用で希望の動作が得られるのではないでしょうか。

ただし携帯端末はクッキーが使えなかったので
セッションIDをURLパラメータに付加しないと
セッションが有効になりません。

なので php.ini で session.use_trans_sid を有効にするか、
test2.php へのアンカーに自前で
<a href="http://hoge/test2.php?<?php echo SID; ?>">test2</a>
と付加しなければなりません。

このあたりは、マニュアルを参照下さい。
http://jp.php.net/manual/ja/ref.session.php
Parent: 2439  reply: 2447 返信 編集 削除

[2447] お返事ありがとうございます。あと・・・

user: ちひろ | created: 2005-08-10 20:33
ゆうじさん。
早速のお返事ありがとうございました。

大部やりたいことに近づいてきましたがなにしろ初心者ですので
全く応用が利きません(スミマセン)。

そこでもう少しお聞きしたいのですが、例えば

http://mobile.yahoo.co.jpというサイトにアクセスしたことを記憶しておき、
自分のサイトに戻ってきて制限のあるリンクをクリックする際
http://mobile.yahoo.co.jpにアクセスしているかを確認し
アクセスしている場合は→正常にページを表示
アクセスしていなかった場合は→警告メッセージを表示
ということは可能でしょうか?

ど素人のため全て頼ってる感じになっちゃってますが、
よろしくおねがいします。
Parent: 2443  reply: 2449 返信 編集 削除

[2449] アンカーの記録とLocationヘッダ

user: ゆうじ | created: 2005-08-10 23:16
http://mobile.yahoo.co.jp
ご自身で管理できるページではありませんよね。
それだと http://mobile.yahoo.co.jp 側で
アクセスの履歴を残すことは不可能ですね。

なので自分が管理するページにて
クリックされたアンカーを記録する必要がありますね。
そのためには飛び先を一旦記録用のスクリプトに指定し
Location で本来のリンク先に飛ばすようにしてはいかがでしょう。

location.php (記録用スクリプト)
<?php
// 下準備
session_start();
$_SESSION['uid'][0] = true; // ダミー
$uid = $_GET['uid'];

// URLID対応テーブル
$uidTable = array(
1 => 'http://www.yahoo.co.jp/',
2 => 'http://www.google.co.jp/',
3 => 'http://www.goo.ne.jp/'
);

// URLパラメータチェック
if (!preg_match('/^[123]$/', $uid) {
?>
<p>指定のURLはありません。</p>
<?php
exit();
}

// 観覧済みuidのチェック
if ($_SESSION['uid'][$uid - 1]) {
// OKならば
// クリックされたuidをセッションに記録
$_SESSION['uid'][$uid] = true;
// 本来のとび先に飛ばす
header('location: '. $uidTable[$uid]);
exit();
} else {
// Noならエラーメッセージ
?>
<p>前のページに戻り順番にリンクをたどってください。</p>

link.html (アンカーの表示ページ)
1.<a href="location.php?uid=1">Yahoo!</a><br>
2.<a href="location.php?uid=2">Google</a><br>
3.<a href="location.php?uid=3">Goo</a><br>

もしかすると携帯端末では
header('location: ?') を受け付けてくれず
まったく動作しないかもしれません。
Parent: 2447  reply: 2450 返信 編集 削除

[2450] エラーが出てしまいます・・・。

user: ちひろ | created: 2005-08-10 23:55
毎回親切にありがとうございます。

早速location.phpを試してみたのですが

Parse error: parse error in /vol2/HTTP/z/アカウント名/docs/location.cgi on line 14

というエラーが発生してしまいますがどうしたらようでしょうか?

ちなみに使用しているサーバーがPHPを使う際、CGIとして使わなくてはいけないので
1行目に#!/usr/local/bin/phpが入ります。
したがって本来のエラーラインは15かと・・・?
Parent: 2449  reply: 2451 返信 編集 削除

[2451] Parse error

user: ゆうじ | created: 2005-08-11 00:11
Parse error は、文法上の誤記がある場合に出るエラーです。
line 14 とありますので、その行以前に、
括弧の閉じ忘れや、; や " や ' などの忘れがないか確かめてください。

// URLパラメータチェック
if (!preg_match('/^[123]$/', $uid) {

ここで if の閉じ括弧がありませんね。
失礼しました。

【正解】
// URLパラメータチェック
if (!preg_match('/^[123]$/', $uid)) {
Parent: 2450  reply: 2452 返信 編集 削除

[2452] さらにエラー

user: ちひろ | created: 2005-08-11 00:20
14行目のエラーは直りました!
しかし今度は32行目と出ましたが、これは

exit();
} else {
// Noならエラーメッセージ

の部分の
} else {←この括弧を消す。で正解でしょうか?
Parent: 2451  reply: 2453 返信 編集 削除

[2453] 失礼しました

user: ゆうじ | created: 2005-08-11 00:30
exit();
} else {
// Noならエラーメッセージ
?>
<p>前のページに戻り順番にリンクをたどってください。</p>
<?php
}
?>

正しくは↑のように
最後の閉じ括弧を書くのが正解でしょうね。

制御構造は変わらないので
else を削除するのもありです。

exit();
}
Parent: 2452  reply: 2454 返信 編集 削除

[2454] なるほど!ところで・・・

user: ちひろ | created: 2005-08-11 00:39
なかなか難しいですね・・・(笑

ところでアンカーだのLocationだのそれ自体を理解してないのでいまいち流れがつかめません。

例えばYAHOO!を表示後Googleにアクセスを可能にしたい場合はどうすればよいのでしょうか?

それと直接URLを入力されてしまってはこのシステムも無意味となってしまうのでしょうか?
Parent: 2453  reply: 2455 返信 編集 削除

[2455] Re. なるほど!ところで・・・

user: ゆうじ | created: 2005-08-11 09:17
> ところでアンカーだのLocationだのそれ自体を理解してないのでいまいち流れがつかめません。

アンカーは、リンクする時に使う anchor tag の意です。
つまり <a href="・・・">・・・</a> のこと。

Location は、header('location: ?') の一文の意で、
ウェブサーバがブラウザに対して送信する
「指定のURLに移動してくれ」という指示のことです。


> 例えばYAHOO!を表示後Googleにアクセスを可能にしたい場合はどうすればよいのでしょうか?

記事[2449]のコードがそのつもりだったのですが
意図するものと違うのでしょうか?


> それと直接URLを入力されてしまってはこのシステムも無意味となってしまうのでしょうか?

この「直接URL」とはどのURLのことでしょうか?
Parent: 2454  reply: 2456 返信 編集 削除

[2456] たまにアクセス失敗!?

user: ちひろ | created: 2005-08-11 10:10
昨晩は遅くまでありがとうございました。

> アンカーは、リンクする時に使う anchor tag の意です。
> つまり <a href="・・・">・・・</a> のこと。
>
> Location は、header('location: ?') の一文の意で、
> ウェブサーバがブラウザに対して送信する
> 「指定のURLに移動してくれ」という指示のことです。
>
>
> > 例えばYAHOO!を表示後Googleにアクセスを可能にしたい場合はどうすればよいのでしょうか?
>
> 記事[2449]のコードがそのつもりだったのですが
> 意図するものと違うのでしょうか?

この辺りは理解できました。

しかし数回に1回は順番通りにたどっていっても警告メッセージを表示してしまいます。
これはCookieに上手く書き込まれていないのでしょうか?

しかし携帯ですので実際にはCookieは使いませんが、php.iniで
session.use_trans_sid = On
としてもURLにセッションIDが埋め込まれません。
ですので携帯ではまだ試せていない状況です。

> この「直接URL」とはどのURLのことでしょうか?

これもなんとか自力で解決しました。
Parent: 2455  reply: 2457 返信 編集 削除

[2457] 動作サンプル

user: ゆうじ | created: 2005-08-11 21:47
サンプル挙げてみました。
http://www.sound-uz.jp/php/_test/link.php

携帯を想定してセッションIDを強制的に
全てのURLに付加するよう手直ししてあります。
さらに戻るためのリンクと
uidを初期化するためのクリアのリンクを付けました。


PCで確かめると私が意図してる通りの動作です。

が、携帯(Docomo/P505is)で見ると動作はしてるけど、
携帯の戻るボタンでlink.phpに移動している限りは
[済・未]の表示が切り替わらないようですので
セッションIDが引き継がれて無いことがわかります。
戻るボタンはキャッシュの呼び出しなので
当たり前と言えば当たり前ですね。

その対策として、link.php に飛んでくる前に
URLにセッションIDを付加するページをかませば
上手く動作するかと思い作ったのが、index.php です。
http://www.sound-uz.jp/php/_test/index.php

index.php を入り口ページとした場合は
更新すれば[済・未]の表示が切り替わるので
セッションIDが引き継がれていることがわかります

携帯ではキャッシュを無効に出来ないってことのようです。

これらを材料に検証してみてください。

link.php
<?php
session_start();
$sid = session_name(). '='. session_id();
?>
<h5>リンク先を制限するサンプル</h5>
<p>1→2→3と順番にクリックしていかないと見れません。</p>
1.<a href="location.php?uid=1&<?php echo $sid ?>">Yahoo!</a>
[<?php if($_SESSION['uid'][1]){echo '済';}else{echo '未';} ?>]<br>
2.<a href="location.php?uid=2&<?php echo $sid ?>">Google</a>
[<?php if($_SESSION['uid'][2]){echo '済';}else{echo '未';} ?>]<br>
3.<a href="location.php?uid=3&<?php echo $sid ?>">Goo</a>
[<?php if($_SESSION['uid'][3]){echo '済';}else{echo '未';} ?>]<br>
<br><a href="location.php?uid=0&<?php echo $sid ?>">クリア</a>

location.php
<?php
// 下準備
session_start();
$_SESSION['uid'][0] = true; // ダミー
$sid = session_name(). '='. session_id();
$uid = $_GET['uid'];

// URLID対応テーブル
$uidTable = array(
1 => 'http://www.yahoo.co.jp/',
2 => 'http://www.google.co.jp/',
3 => 'http://www.goo.ne.jp/'
);

// URLパラメータチェック
if (!$uid) {
// $uid が無い場合は$_SESSION['uid']をクリア、
// ink.phpに戻る
unset($_SESSION['uid']);
header('location: link.php?'. session_name().'='.session_id());
exit();
} if (!preg_match('/^[123]$/', $uid)) {
// $uid が1,2,3のどれでもない場合は、エラーメッセージ
?>
<p>指定のURLはありません。</p>
<p><a href="link.php?<?php echo $sid ?>">戻る</a></p>
<?php
exit();
}

// 観覧済みuidのチェック
if ($_SESSION['uid'][$uid - 1]) {
// OKならば
// クリックされたuidをセッションに記録
$_SESSION['uid'][$uid] = true;
// 指定のリンク先に飛ばす
header('location: '. $uidTable[$uid]);
exit();
} else {
// Noならエラーメッセージ
?>
<p>前のページに戻り順番にリンクをたどってください。</p>
<p><a href="link.php?<?php echo $sid ?>">戻る</a></p>
<?php
}
?>

index.php
<?php
session_start();
$sid = session_name(). '='. session_id();
?>
<h5>表紙ページ</h5>
<a href="link.php?<?php echo $sid ?>">link.php</a>
Parent: 2456  reply: 2461 返信 編集 削除

[2461] CGIでは無理?

user: ちひろ | created: 2005-08-12 19:11
ご丁寧にありがとうございます。
しかもサンプルページまで作って頂いて。
感謝、感謝です。

サンプルで試してみたところ完璧に動作しました!(FOMA/sh901isで動作確認)

ところが自分のサーバーにアップすると上手いこと機能してくれません。

私が使っているサーバーではPHPをCGIとして
アップロードさせなくてはいけないのでそれが原因でしょうか?

ちなみに拡張子cgiとしてアップした場合
index.cgiからlink.cgiへのアドレスが

http://ドメイン名/link.cgi?PHPSESSID=a1b2c3&PHPSESSID=a1b2c3

という具合に同じセッションIDが&で区切られ出てきてしまいます。

これは関係ないのでしょうか?


また、現在session.use_trans_sidをOnにしても上手くIDが
埋め込まれない原因をサーバー会社側に問い合わせ中です。
Parent: 2457  reply: 2465 返信 編集 削除

[2465] Re. CGIでは無理?

user: ゆうじ | created: 2005-08-13 11:00
これは変ですね。
http://ドメイン名/link.cgi?PHPSESSID=a1b2c3&PHPSESSID=a1b2c3

session.use_trans_sid が On の状態で
私が書いたコードを実行すると
二重にセッションIDが付加されるかもしれませんが・・・。

残念ながら私はCGI版PHPの実行環境を持たないので
確かめることができません。

参考までにこちらの環境と
phpinfo()で得られるSession Directive を書いておきます。
FreeBSD 4.10
Apache 1.3.33
PHP 4.3.10

session.auto_start Off
session.bug_compat_42 On
session.bug_compat_warn On
session.cache_expire 180
session.cache_limiter nocache
session.cookie_domain no value
session.cookie_lifetime 0
session.cookie_path /
session.cookie_secure Off
session.entropy_file no value
session.entropy_length 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 1
session.name PHPSESSID
session.referer_check no value
session.save_handler files
session.save_path /tmp
session.serialize_handler php
session.use_cookies On
session.use_only_cookies Off
session.use_trans_sid Off
Parent: 2461  reply: 2471 返信 編集 削除

[2471] 解決しました!

user: ちひろ | created: 2005-08-13 18:52
こんばんわ。

IDが二重になってしまう原因はゆうじさんのご指摘通り、
session.use_trans_sidを有効にした状態で実行したために起こってしまった現象でした。

session.use_trans_sidを無効にしてみたところCGI形式でも
完璧な動作をしてくれました!


色々と教えてくださってくれて本当にありがとうございました。
感謝の限りです。
これからこのシステムを利用してサイトを作っていきたいと思います。

今後分からないことが出てきたらそのときはまたお世話になってもよろしいでしょうか?

それではこの辺で失礼します。
Parent: 2465  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 390 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑