宜しくお願いします。
携帯向けのHPを作成しています。
ページを製作する際に、
Aのリンク先をクリックするとBのリンク先にアクセスできる機能を組み入れたいと思います。
TOPページからAリンク先をクリック→TOPページに戻り→Bリンク先にアクセス。
Aをクリックしない場合はBにアクセスできない。
という機能です。
こちらをつくるのは難しいでしょうか?
CGIをつかわずに行うことは可能ですか?←ダメ元ですが…。
http://okwave.jp/qa3960723.html
http://okwave.jp/qa1417302.html
を参考にさせて頂いたのですが、解決はされていないようなので。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
質問の意図がよくわからないので文面をそのまま素直に受け取ると
「Aのリンク先」と呼ばれるものを消して単純に「Bのリンク先」にしてしまえば良いと思うのですが・・・。
もしかしたら、通常はAのリンク先に飛ぶけれども、キャリアを判別して特定の携帯のみBのリンク先に飛ばせるようにしたいというのでしょうか?
携帯が対象だとクライアントサイドスクリプト(JavaScriptなど)は使えないことを前提としなければいけないので、CGIはいやだとなるとPHPで作るくらいしか道は無いでしょう。
No.2
- 回答日時:
ウェブサイトをブラウジングできる携帯を持っていないので、下記のサイトを参考に
作ってみました。
個体識別情報の取得方法
http://pentan.info/mobile/get_uid.html
検証していなので(できないので)、うまく動作するかはわからないです。
まず、トップページですが、以下の要領で作ってください。
【top.html】
<html>
<body>
<p><a href="manage.cgi?guid=on&mode=regist">最初に見るべきページ</a></p>
<p><a href="manage.cgi?guid=on">次に見ることができるページ</a></p>
</body>
</html>
次に、以下に書いてある”manage.cgi”というcgiファイルを作ってください。
冒頭に設定項目があるので、ご自分のサイトに合うように書き変えてください。
”見るべきページを見た後の有効時間”($valid_duration)とは、この時間内
に”次に見ることができるページ”を見ないとタイムアウトする時間(分単位)
のことです。
”順番通り見なかったときのエラーページ”($error_page)とは、”見るべき
ページ”を見ずに”次に見ることができるページ”を見ようとしたときのエラー
ページです。例えば、以下のようなものを作ればいいと思います。
【error.html】
<html>
<body>
<p>このページを見るには、以下のページを最初に見てください。</p>
<p><a href="manage.cgi?guid=on&mode=regist">最初に見るべきページ</a></p>
</body>
</html>
【manage.cgi】
#-- 以下を自分のページに合うように設定してください ----------------
my $must_see_page = 'must_see.html'; # 最初に見るべきページ
my $second_page = 'second.html'; # 次に見ることができるページ
my $error_page = 'error.html'; # 順番通り見なかったときのエラーページ
my $valid_duration = 30; # 見るべきページを見た後の有効時間(分単位)
#------------------------------------------------------------------
use Fcntl qw(:DEFAULT :flock);
use CGI;
my %carrier_info = (
docomo => { re_ua => qr/DoCoMo/i, env_uid => 'HTTP_X_DCMGUID' },
au => { re_ua => qr/UP. ?Browser/i, env_uid => 'HTTP_X_UP_SUBNO' },
Softbank => { re_ua => qr/J-PHONE|Vodafone|SoftBank/i, env_uid => 'HTTP_X_JPHONE_UID' },
WILLCOM => { re_ua => qr/WILLCOM/i, env_uid => 'REMOTE_ADDR' },
EMOBILE => { re_ua => qr/emobile/i, env_uid => 'HTTP_X_EM_UID' },
);
my %user;
while ( my ($carrier, $info) = each %carrier_info ) {
if ( $ENV{HTTP_USER_AGENT} =~ $info->{re_ua} ) {
$user{carrier} = $carrier;
$user{uid} = $ENV{ $info->{env_uid} };
last;
}
}
$user{carrier} = 'other' unless $user{carrier};
$user{uid} = $ENV{REMOTE_ADDR} unless $user{uid};
sysopen my $in, "$user{carrier}.cgi", O_RDONLY | O_CREAT or die $!;
flock $in, LOCK_SH;
my @registered_uids = <$in>;
close $in;
my $mode = CGI->new->param('mode') || q{};
if ( $mode eq 'regist' ) {
regist(\%user, \@registered_uids);
} else {
check(\%user, \@registered_uids);
}
sub render {
my $file = shift;
print "Content-Type: text/html\n\n";
open my $html, '<', $file or die $!;
print <$html>;
close $html;
}
sub regist {
my ($user, $registered_uids) = @_;
my $uid_is_registered;
for my $registered_uid (@$registered_uids) {
my ($uid) = split /\s|\n/, $registered_uid;
if ( $uid eq $user->{uid} ) {
$registered_uid = "$user->{uid} $^T\n";
$uid_is_registered = 1;
last;
}
}
if ( not $uid_is_registered ) {
push @$registered_uids, "$user->{uid} $^T\n";
}
open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @$registered_uids;
close $out;
render $must_see_page;
}
sub check {
my ($user, $registered_uids) = @_;
my (@updated_uids, $uid_is_found);
for my $registered_uid (@$registered_uids) {
my ($uid, $time) = split /\s|\n/, $registered_uid;
next if $^T - $time > $valid_duration*60;
push @updated_uids, $registered_uid;
$uid_is_found = 1 if $uid eq $user->{uid};
}
open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @updated_uids;
close $out;
if ($uid_is_found) {
render $second_page;
} else {
render $error_page;
}
}
参考URL:http://pentan.info/mobile/get_uid.html
この回答への補足
詳しく有難うございます!
【top.html】
<html>
<body>
<p><a href="manage.cgi?guid=on&mode=regist" "URL">ページ表示名</a></p>
<p><a href="manage.cgi?guid=on" "URL">ページ表示名</a></p>
</body>
</html>
このような感じであっていますでしょうか?
#-- 以下を自分のページに合うように設定してください ----------------
my $must_see_page = 'must_see.html'; # 最初に見るべきページ ←
my $second_page = 'second.html'; # 次に見ることができるページ ←
my $error_page = 'error.html'; # 順番通り見なかったときのエラーページ ←直接URLを入力すれば良いのでしょうか?
my $valid_duration = 30; # 見るべきページを見た後の有効時間(分単位)←直接数字(30など)を入力すればよいのでしょうか?
No.3
- 回答日時:
補足質問にお答えします。
>←直接URLを入力すれば良いのでしょうか?
URLでなくご自分のサーバー内にあるファイル名を入力してください。
ご自分のサーバーではなく、外部のページに飛ばしたいのなら、また別途作り直す
必要があります。
←直接数字(30など)を入力すればよいのでしょうか?
はい、そうです。
この回答への補足
ありがとうございます!
説明が不足していてすみませんでした。
自身のサーバーではなく外部のページです。
もしくは、
indexからAのページをクリック→戻る→indexページに隠しリンクが表示される。
などの方法も考えたのですが、どちらの方が簡易的でしょうか?
No.4
- 回答日時:
前回の補足について回答し忘れてた部分がありました。
<p><a href="manage.cgi?guid=on&mode=regist" "URL">ページ表示名</a></p>
<p><a href="manage.cgi?guid=on" "URL">ページ表示名</a></p>
>このような感じであっていますでしょうか?
ここにはURLを記述しないでください。
URLは”manage.cgi”の中の以下のところに記述してください。
my $must_see_page = 'http://www.google.com'; # 最初に見るべきページ
my $second_page = 'http://www.yahoo.co.jp'; # 次に見ることができるページ
そして、”top.html”では以下のように記述してください。
<p><a href="manage.cgi?guid=on&mode=regist">ページ表示名</a></p>
<p><a href="manage.cgi?guid=on">ページ表示名</a></p>
>自身のサーバーではなく外部のページです。
その場合は、sub renderという関数を以下のように変更してください。
sub render {
my $file = shift;
print "Content-Type: text/html\n\n";
open my $html, '<', $file or die $!;
print <$html>;
close $html;
}
↓ ↓ ↓
sub render {
my $file = shift;
if ( $file =~ /^http/ ) {
print "Location: $file\n\n";
} else {
print "Content-Type: text/html\n\n";
open my $html, '<', $file or die $!;
print <$html>;
close $html;
}
}
>indexからAのページをクリック→戻る→indexページに隠しリンクが表示される。
>などの方法も考えたのですが、どちらの方が簡易的でしょうか?
難易度はどちらも同じぐらいだと思います。
No.5
- 回答日時:
>indexからAのページをクリック→戻る→indexページに隠しリンクが表示される。
このバージョンも作ってみました。
まず、トップページ表示用の”top.html”ファイルを作ってください。
隠しリンクは、<!--hidden ~ --> で囲みます。
以下、その例です。
【top.html】
<html>
<body>
<p><a href="top.cgi?guid=on&mode=regist">最初に見るべきページ</a></p>
<!--hidden
<p><a href="http://www.yahoo.co.jp">次に見ることができるページ</a></p>
-->
</body>
</html>
それから、以下の”top.cgi”というファイルを作ってください。
冒頭の設定部分はご自分の環境に合わせて書き変えてください。
そして、トップページに表示させるファイルですが、”top.html”でなく
"top.cgi?guid=on"ですので注意してください。”top.html”は訪問者からは
アクセスできないファイルです。
要するに、訪問者がアクセスするURLは以下のような感じとなります。
http://www.ri-an.jp/top.cgi?guid=on
【top.cgi】
#-- 以下を自分のページに合うように設定してください ----------------
my $top_page = 'top.html'; # トップページに表示させるファイル
my $must_see_page = 'http://www.google.com'; # 最初に見るべきページ
my $valid_duration = 30; # 見るべきページを見た後の有効期間(分単位)
#------------------------------------------------------------------
use Fcntl qw(:DEFAULT :flock);
use CGI;
my %carrier_info = (
docomo => { re_ua => qr/DoCoMo/i, env_uid => 'HTTP_X_DCMGUID' },
au => { re_ua => qr/UP. ?Browser/i, env_uid => 'HTTP_X_UP_SUBNO' },
Softbank => { re_ua => qr/J-PHONE|Vodafone|SoftBank/i, env_uid => 'HTTP_X_JPHONE_UID' },
WILLCOM => { re_ua => qr/WILLCOM/i, env_uid => 'REMOTE_ADDR' },
EMOBILE => { re_ua => qr/emobile/i, env_uid => 'HTTP_X_EM_UID' },
);
my %user;
while ( my ($carrier, $info) = each %carrier_info ) {
if ( $ENV{HTTP_USER_AGENT} =~ $info->{re_ua} ) {
$user{carrier} = $carrier;
$user{uid} = $ENV{ $info->{env_uid} };
last;
}
}
$user{carrier} = 'other' unless $user{carrier};
$user{uid} = $ENV{REMOTE_ADDR} unless $user{uid};
sysopen my $in, "$user{carrier}.cgi", O_RDONLY | O_CREAT or die $!;
flock $in, LOCK_SH;
my @registered_uids = <$in>;
close $in;
my $mode = CGI->new->param('mode') || q{};
if ( $mode eq 'regist' ) {
regist(\%user, \@registered_uids);
} else {
show_top_page(\%user, \@registered_uids);
}
sub regist {
my ($user, $registered_uids) = @_;
my $uid_is_registered;
for my $registered_uid (@$registered_uids) {
my ($uid) = split /\s|\n/, $registered_uid;
if ( $uid eq $user->{uid} ) {
$registered_uid = "$user->{uid} $^T\n";
$uid_is_registered = 1;
last;
}
}
if ( not $uid_is_registered ) {
push @$registered_uids, "$user->{uid} $^T\n";
}
open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @$registered_uids;
close $out;
print "Location: $must_see_page\n\n";
}
sub show_top_page {
my ($user, $registered_uids) = @_;
my (@updated_uids, $uid_is_found);
for my $registered_uid (@$registered_uids) {
my ($uid, $time) = split /\s|\n/, $registered_uid;
next if $^T - $time > $valid_duration*60;
push @updated_uids, $registered_uid;
$uid_is_found = 1 if $uid eq $user->{uid};
}
open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @updated_uids;
close $out;
open my $html, '<', $top_page or die $!;
my $top_page_html = do { local $/; <$html> };
close $html;
if ($uid_is_found) {
$top_page_html =~ s/<!--hidden(.*?)-->/$1/sg;
} else {
$top_page_html =~ s/<!--hidden(.*?)-->//sg;
}
print "Content-Type: text/html\n\n";
print $top_page_html;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(パソコン・スマホ・電化製品) とある情報が知りたく、検索して表示されたリンクをクリックしてページを見て、そこに知りたい情報の説明の 3 2022/11/26 18:55
- HTML・CSS スマホでHTMLファイルを開いてリンク先へ移動させたいです 2 2023/03/04 18:06
- 美術・アート トレパク疑惑をかけられにくくするには ここ最近いわゆるトレパク警察のいいがかりがが厳しくなったようで 1 2023/08/21 09:59
- PDF こんなPDF作れますか? 6 2022/05/13 11:14
- その他(コンピューター・テクノロジー) <a href="file:///フォルダ名/ファイル名">リンクテキスト</a>について 1 2023/04/06 22:40
- Yahoo!メール ヤフーメールの新様式 1 2022/04/01 08:03
- その他(ブラウザ) このページは動作していません HTTP ERROR 401 2 2022/11/28 12:11
- ハッキング・フィッシング詐欺 JS/Packed.Agent.N が検出されたサイトにアクセスするとどうなる? 4 2022/08/12 18:28
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP Laravelだと、簡易なログイン機能であればコマンド1発でサクッ 1 2022/05/21 23:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
iis+cgiでmultipart/form-data...
-
CGI経由でのPDFファイルをダウ...
-
2つのドメイン、同じサーバー。...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
WEBページを強制的に横画面で見...
-
select値をhiddenのvalueに渡し...
-
pythonのnumpyでの列(縦)ベク...
-
日本語文字化け(GETメソッド?)
-
EXCELとの連携
-
チェックボックスグループの一...
-
HTML プルダウンメニューの選択...
-
vsftpd+sslでアップロードできない
-
Javascriptの変数をCGIに送る方法
-
INPUT TYPE
-
VB.net データーグリッドビュー...
-
チェックボックスの返す値
-
「value」に2つの値をセットす...
-
postデータのあるページの再表示
-
VB初心者。小数点以下の表示で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl/cgi リダイレクトができない
-
htmlからパラメータで、cgiに渡...
-
フォントサイズを変えるには?
-
CGI経由でのPDFファイルをダウ...
-
CGI
-
プログラム実行中の待機ページ...
-
メイルフォームの本文が文字化け
-
Yomi-Searchのカテゴリを縦並び...
-
cgi(perl) sendmailの使い方
-
sendmail 送信先を複数設定す...
-
iis+cgiでmultipart/form-data...
-
<FORM TYPE="subumit">でデータ...
-
サーバー上のPDFにCGIでパスワ...
-
指定のフォルダに指定のファイ...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
select値をhiddenのvalueに渡し...
-
「value」に2つの値をセットす...
-
チェックボックスの返す値
-
INPUT TYPE
おすすめ情報