トップページはこちら

自身のサイトを携帯に簡易対応する場合のあれこれ

URLについて

このスクリプトを介してサイトを表示する際のURLは、「スクリプトのURL?サイトのURL」という形式ですが、サイトのURLについては様々な形式を受け付けるようになっています。以下のURLはすべて、デモサイトで、Googleでの「蕎麦」の検索(http://www.google.co.jp/search?q=%E8%95%8E%E9%BA%A6)を表示するURLで、このように、「http://」の有無、URLエンコードの有無、キーワード(以下では「_ucb_u=」)の有無に関わらず、同じ内容が表示されます。

しかしこれでは、最短のものでも、自身のサイトの携帯版のURLとして紹介するには長すぎるわけで。

リクエストにURLが含まれない場合、既定ではFrontpage.inc.phpの内容が表示されますが、設定ファイル(Config.inc.php)で、定数DEFAULT_URLの値にURLを指定すると、そのURLを表示するようになります。ここに自身のサイト(のトップページとか)のURLを指定しておくことで、スクリプトのURLを、イコール自身のサイトの携帯版のURLとして紹介することができます(なお、この場合、Frontpage.phpは不要になります)。
例えば、PC向けのサイトがwww.example.comの場合に、スクリプトをwww.example.com/i/(index.phpとか)に設置して、定数DEFAULT_URLをwww.example.comと設定しておくと、http://www.example.com/i/にアクセスすると、http://www.example.com/の内容が変換表示されるので、訪問者には、携帯用のURLはhttp://www.example.com/i/ですよ、というように紹介することができるという寸法です。

あるいは、CGIやPHPスクリプトによる動的ページについては、携帯端末がそのページにアクセスした場合には「スクリプトのURL?そのページのURL」にリダイレクトするようにしておくとスマートかもしれません。PHPの場合は、以下の例のように、このスクリプトに含まれる端末判別クラス(ClientDetect.class.php)を利用することもできます。

<?php
if (false != @include_once 'ClientDetect.class.phpへのローカルパス') {
  $client =& new ClientDetect();
  if (preg_match('/^(?:docomo|au|vodafone)$/', $client->dev_type)) {
    header('Location:http://スクリプトのURL(フルパス)?http'.(
      isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on'? 's': null
    ).'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit;
  }
}
?>

なお、以下のように、LINK要素にMobile Link Discoveryを記述しておくと、インテリジェントなエージェントは携帯用のURLを示してくれるかもしれません。例えば、Googleなど幾つかの検索エンジンは、Mobile Link Discoveryを検出すると、そのURLを携帯向けサイトとして登録します。

<link rel="alternate" type="text/html" media="handheld" href="携帯用のURL" />

また、このスクリプトと同様にPC向けのサイトを携帯向けに変換する、Google Website Transcoder(GWT)は、Mobile Link Discoveryが記述されたページにアクセスすると、通常の変換処理を行わずに、Mobile Link DiscoveryのURLにリダイレクトするようになっています。

ページの任意の箇所を非表示にする

ページ内の特定箇所を携帯では表示したくない(除去したい)という場合、HTMLソース中で非表示にしたい箇所を、<!--pc2m_void--><!--/pc2m_void-->で括ると、このスクリプトはこの部分をまるまる除去し、表示しません(後者にはスラッシュを忘れないでください)。
例えば、無料のレンタルサーバなどを利用していて、BODY要素内に強制的に表示される(PC向けの)広告を、このスクリプト経由では非表示にしたい場合、それがbodyタグの直後に挿入されるなら、以下のようにbodyタグを括ります。

<!--pc2m_void-->
<body>
<!--/pc2m_void-->

あるいは、よくありがちな、プルダウンメニューを選択してJavaScriptによってページを遷移させるようなインタフェースは、このスクリプトを介した際には当然機能しませんから、SELECT要素をこれで括り、プルダウンメニュー自体を非表示にしておくといいかも。

<!--pc2m_void-->
<form action="index.html">
  <select onChange="jumpTo()">
    <option value="/">TOP</option>
    <option value="/blog/">BLOG</option>
    <option value="/bbs/">BBS</option>
  </select>
</form>
<!--/pc2m_void-->

ページの任意の箇所を変換対象外とする

HTMLソース中で、<!--pc2m_remain--><!--/pc2m_remain-->で括られた箇所は、HTMLに関する変換は行われずそのまま表示されます(全角半角などの文字種変換と、出力形式(HTMLまたはXHTML)に応じたマークアップ記号の整形は常に行われます)。

<div>
  <!--pc2m_remain-->
  <center>
    <img src="logo.jpg"><br>
    <b><font color="#ff0000">Welcome!</font></b>
  </center>
  <!--/pc2m_remain-->
</div>

上の例では、表示設定次第では表示されない画像や、fontやb、centerといった装飾系のタグが、表示設定に関わらず常に(端末が対応していれば)表示されます。

これを利用する場合、<!--pc2m_remain-->と<!--/pc2m_remain-->で囲んだ箇所の内側と外側でタグのペアが分離しないように充分に注意してください。例えば、上の例を変更した以下のHTMLでは、divの開始タグは<!--pc2m_remain-->と<!--/pc2m_remain-->で囲んだ箇所の外側にあり、一方終了タグはその内側にありますが、このような場合はエラーが発生し、変換処理が正常に行われません。

<div>
  <!--pc2m_remain-->
  <center>
    <img src="logo.jpg"><br>
    <b><font color="#ff0000">Welcome!</font></b>
  </center>
</div>
<!--/pc2m_remain-->

なお、この機能を利用して外部のサイトへの直接のリンクを記述する場合は、既定のTemplate.inc.phpにある「直」リンクのように、中継スクリプト(r.php)を経由するようにしてください。

<!--pc2m_remain-->
<a href="r.php?http://www.yahoo.co.jp">パソコンでもケータイでもヤフー!</a>
<!--/pc2m_remain-->

これは、このスクリプトのセッションIDが、Refererによって外部に漏洩するのを防ぐためのもので、端末がRefererを送信しており、かつRefererにこのスクリプトのセッションIDが含まれる場合は、クッション画面を表示します。それ以外は外部サイトにシームレスにリダイレクトされるので、通常、利用者には殆ど意識されません(具体的にクッション画面が表示されるケースは、EZweb端末やPCなど、Refererを送信する端末で、Cookieを無効にしている場合などです)。なお、セッションID漏洩の危険性についてはセッションとセキュリティをご覧ください。

自動トリミング

PC向けのウェブページでは、TABLE要素やCSSなどを用いて複数のペインを並べた立体的な構成が好まれますが、このスクリプトはこのような構成を無視して、HTMLに書かれた順番通りの表示を行います。
例えば、以下のHTMLは、(CSSを用いて)縦に3段、中央の段が横に3列という、PC向けのウェブページとしては典型的なペイン構成を想定したものだとして、これをこのスクリプトを介して表示すると、HTMLの記述順通りに、ヘッダ部~左メニュー~記事本文~右メニュー~フッタ部と表示されます。

<!DOCTYPE html PUBLIC
  "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type"
  content="text/html; charset=Shift_JIS">
</head>
<body>

<div id="header">
  ヘッダ部
</div>
<div id="menu-left">
  左メニュー
</div>
<div id="main">
  記事本文
</div>
<div id="menu-right">
  右メニュー
</div>
<div id="footer">
  フッタ部
</div>

</body>
</html>

この場合、ヘッダ部や左メニューの内容次第では、記事本文に到達するまで延々とスクロールする必要があったり、ページが分割表示されている場合には、最初の分割には記事本文は登場しないということが起こる場合がありますが、このスクリプトには表示を開始する箇所を指定することができる、「自動トリミング」という機能があります。例えば、上例のHTMLを記事本文から表示するには、、設定ファイル(Config.inc.php)の「自動トリミングの設定」で以下のように記述します(記述の詳細は、Config.inc.phpにあるコメントを参照ください)。

define('FORCE_TRIM', true);
$force_trim = array(
  'URLの一部' => array('main', true)
);

なお、例えば記事本文から(いきなり)表示が始まる場合は、携帯での訪問者がサイト内のナビゲーションに困ってしまうことが予想されます。このような場合は、表示開始位置の直後に、携帯での訪問者向けに簡潔なメニューを配し、CSSの「display:none」などでPCでの訪問者には非表示にしたブロックを用意するといった工夫が必要かもしれません。

<div id="main">
  <div style="display:none !important">
    <a href="/">TOP</a>
    <a href="#menu">MENU</a>
    <a href="/blog/">BLOG</a>
    <a href="/bbs/">BBS</a>
  </div>
  記事本文
</div>

imgタグについて

表示モードが「テキストのみ」の場合、imgタグは [alt属性値またはファイル名の一部+] のように変換され、aタグで囲われている場合は、「alt属性値またはファイル名の一部」の部分がその本来のリンクになります。この部分がファイル名の一部では、それがどのようなリンクであるか、殆どの場合理解できない筈で、特にメニュー類のテキストを画像化している場合には、alt属性値を付与しておくことを強くお勧めします(もちろん、alt属性値はアクセシビリティの観点でも非常に重要です)。

このスクリプトは、デザイン装飾のために用意されていて、携帯での表示時には意味のない画像を非表示にする(imgタグを除去する)機能があります。imgタグのwidthとheight属性の値が、設定ファイル(Config.inc.php)で定義されている、定数IMG_THRESHOLDに満たないimgタグは除去されます。これらの属性がないものは全て残され、一方これらの属性値が%単位で指定されているものは、その値に関わらず除去されます。ただし、aタグで囲まれているimgタグは、この条件に関わらず全て残されます。この詳細は、画像の表示の、「詳しい説明」あたりを参照してください。
また、表示モードを「テキストと画像の同時表示」の「一部変換」にしている場合には、画像が変換して表示されるか、オリジナルのものがスルーで表示されるかは、width属性値で決まります。端末画面の横幅よりもwidth属性値が大きい(及びこの属性がない)画像は変換して表示されます。

以上を踏まえて、設定ファイルのIMG_THRESHOLDを適切な値に設定してください(必要ならimgタグの属性値も調整してください)。
重要なのは、必要なimgタグが除去されてしまわないようにすることです。例えばWordPressをAuthImageプラグインと共に利用している場合、AuthImage画像を配置しているimgタグが除去されてしまってはならないため、IMG_THRESHOLDの値はAuthImage画像の短辺と同じか小さい値にしてください。

FORM要素について

ページが端末のキャッシュサイズ(メモリ容量)に応じて分割される場合、フォームの全要素がひとつの分割に収まらない可能性があり、その場合そのフォームは、当然ながら正常には機能しません。この場合、FORM要素、あるいはその直前から分割を開始することでこの可能性を軽減できますが、このスクリプトでは、フラグメントを利用して、特定の箇所から分割を開始するリンクを用意することができます。
例えば、以下のHTMLを、このスクリプトを介して表示した場合、リンク部分をクリックするとH2要素の箇所から分割が開始されます(もちろん、以下の例のようなid属性ではなく、name属性を持つA要素を用いても構いません)。

<p><a href="#comment_form">この記事へのコメントをお寄せください。</a></p>

<h2 id="comment_form">コメント投稿フォーム</h2>
<form action="comment.cgi">
<p><textarea name="text"></textarea></p>
<p><input type="submit" /></p>
</form>

JavaScript記述を伴うA要素について

殆どの携帯端末はJavaScriptを解さないため、このスクリプトはSCRIPT要素を始めとしたJavaScriptに関する記述をすべて除去します。例えば以下の例のように、href属性値のスキームが「javascript」であるA要素は、要素全体を除去します。

<a href="javascript:window.open('hoge.html')">別窓で開きます</a>

また、上の例はしばしば以下のようにも書かれます。この例では、onclickハンドラが除去されるのはもちろん、このように値が「#」のみのhref属性は、一般的にイベント処理のためのダミーとして記述されるため、やはり要素全体を除去します。

<a href="#" onclick="window.open('hoge.html')">別窓で開きます</a>

実際のところ、これらの記述は標準のHTML文法的にも推奨されないか誤りだったりします。
一方以下の例は、JavaScript機能が有効なウェブブラウザでは上の2例と同様に機能し、それ以外では通常のリンクとして機能します。そして、このスクリプト経由でも、onClickハンドラが除去されるのみのため、やはり通常のリンクとして機能します(なお、以下では省略してしまっていますが、本来アクセシビリティの観点では、onclickを記述する場合はonkeypressも対で記述するよう推奨されています)。

<a href="hoge.html" onclick="window.open('hoge.html'); return false">別窓で開くかもしれません</a>

Flashを利用している場合

このスクリプトは、OBJECT要素あるいはEMBED要素をリンクテキストに置換します(IMG要素と異なり、「テキストと画像の同時表示」の設定に関わらず、EMBED要素は常にリンクテキストに置換されます)。しかし、Flashは、PC用のものと携帯端末用のものでは形式が異なり、PC用に製作されたFlashは、通常は携帯端末で再生できないため、このリンクテキストは、実際にはあまり意味がありません。
このため、Flashを利用している箇所については、NOEMBED要素やNOSCRIPT要素、あるいはCSSの「display:none」などでPCでの訪問者には非表示にしたブロックなどに、代替要素を用意しておくといいかもしれません。

リンクを伴わないシンプルなアニメーションの場合は、以下のようにして、代替の画像を表示するようにするといいかもしれません。

<!--pc2m_void-->
<object>
  <param name="movie" value="hoge.swf" />
  <embed src="hoge.swf"></embed>
</object>
<!--pc2m_void-->
<noembed>
  <img src="hoge.jpg" alt="Banner Image" />
</noembed>

メニュー項目の表示にFlashを利用している場合は、以下のようにすると、Flashの代わりに各メニュー項目へのリンクテキストを表示します。

<!--pc2m_void-->
<object>
  <param name="movie" value="hoge.swf" />
  <embed src="hoge.swf"></embed>
</object>
<!--pc2m_void-->
<noembed>
  <a href="/">TOP</a>
  <a href="/blog/">BLOG</a>
  <a href="/bbs/">BBS</a>
</noembed>

アマゾンのアフィリエイトを利用している場合

Amazon.co.jpの「個別商品リンク」は、アソシエイトIDも含めてAmazonモバイルへのリンクに変換されます。ただし、2005年の春頃以降にアソシエイトセントラルで作成される「個別商品リンク」については、既定となっている「拡張型」(パッケージ画像や“amazon.co.jpで買う”アイコンが表示されるもの)はIFRAME要素を使用しているため、他のIFRAME要素と同様に除去され、表示されません。この変換の対象となるのは、「リンクのカスタマイズ」で「基本型」を選んで作成される、IFRAME要素を利用しない形式のもののみとなります。

携帯絵文字の変換

アクセス先のページにある携帯端末向けの絵文字は、そのまま(加工せずに)出力されるものもありますが全てではなく、また当然ながら実際の利用機種に応じた絵文字が出力されるわけではありません。

lifegoodさんが、このスクリプトを改変して、PHP 携帯絵文字 自動変換スクリプトの機能を組み入れる手順を公開されておられるので、このスクリプトで絵文字を利用したいかたは参考にしてください。

「PC2M Website Transcoder for Mobile Clients」で絵文字を使う

その他の注意点

MovableTypeによるサイトについての備考

MovableTypeをCMSとして利用しているサイトを携帯端末に対応するなら、MT4iという優れたCGIが製作されています。MT4iでは、携帯端末に応じた表示を行うだけではなく、コメントの投稿やブログの管理も、携帯端末から問題なく行うことができます(mt.cgiの管理操作の多くはJavaScriptに依存しているので、このスクリプト経由ではこのような操作は不能です)。
てなことで、MTなサイトのかたは、先ずはこのスクリプトじゃなく、MT4iを検討したほうがいいですよ。

ただ、現在のバージョン(2.0x系)のMT4iは、エントリーを一覧表示する方法が限定されていて、例えば、(このサイトのように)エントリーを時系列では並べたくない場合や、あるいは、「multiblog」プラグインなどを用いて複数のブログをシームレスに連携させて構成されたサイトなどでは、望むような表示を得られるとは限りませんが、そのような場合には、このスクリプトを表示用に利用する価値はあるのかもしれません。

XOOPSなどのCMSによるサイトについての備考

XOOPSに代表されるモジュール構造の汎用CMSでは、その性格上、MovableTypeにおけるMT4iのような、携帯端末対応のデファクトスタンダードはあまり見られないようで、その表示を携帯端末に簡易に対応するために、このスクリプトを利用する価値はあるかもしれません。しかしMovableTypeの場合と同様に、JavaScriptに依存した機能などは利用できないため、管理機能はもとより、個々のモジュールにも利用できないものがあることでしょう。
また、このようなサイトでは、一般的に、TABLE要素やCSSなどを用いて複数のペイン(モジュールブロック)を並べた立体的な構成が採られますが、このスクリプトはこうした構成を再現することはできず、各要素はHTMLに書かれた通りの順番に並べられてしまいます。

そのため、このスクリプトを利用する場合は、携帯端末での表示時に、どの要素(HTML要素あるいはモジュール)を表示するか(しないか)、そしてどの要素から表示を開始するかを検討した上で、CMSのテンプレートや、このスクリプトの設定ファイル(Config.inc.php)を修正する必要があるかもしれません。
例えば、ある要素は携帯では表示しない(除去してしまう)という場合には、ページの任意の箇所を非表示にする機能を利用してください。あるいは、ページ内の特定の箇所から表示を開始したいという場合は、自動トリミング機能を利用してください。


2005/08/10

トラックバック

このエントリーのトラックバックURL:
http://www.rcdtokyo.com/mt/mt-rcdtokyo5428-tb.cgi/24

コメント

ジオシティーで作っているホームページを携帯で見れるようにしたいんですが できますか

Posted by 名無しさん at 2006/09/01 10:29

このスクリプトを設置するにはサーバに「PHP」という機能が必要ですが、ジオシティーズのサーバにはこの機能はないので、これを設置することはできません。
ジオシティーズとは別にPHP機能のあるサーバを用意すれば設置はできますが、こうした機能を無料で提供している例は少なく、一般的に年間数千円程度の費用がかかり、また、サーバの管理もある程度はご自身で行う必要があるため、ある程度技術的な知識をお持ちか、あるいはそれを今後学習される気構えなのでなければ、決してお勧めではありません。

てなことで、例えばColorsさんちの「SPICE!」サービス http://lupo.jp/spice/ のような、同種の機能を提供しているサービスを利用するのが吉なのではないかと(SPICE!は無償利用の場合は広告が表示されますが)。
いや、うちのデモサイトとかを使ってくれてもいんですが、まあやっぱし企業としてきちんとサービス提供されている(筈の)ものを利用されたほうがなにかといいのかなと。

Posted by ucbさん at 2006/09/01 13:45

お世話になりました。お返事もらえて、助かりました。ほんとに
ありがとうございました。

Posted by 名無しさん at 2006/09/01 15:01

このプログラム使用させてもらうとしようと思い、設置に試行していますが、当方のサイト内に携帯端末用の表示できる掲示板等がある為、特定のURL、もしくはサイト外に出ようとした場合に、このプログラムから抜け出す方法はありますか?

Posted by 名無しさん at 2006/12/01 11:07

単にリンクを変換しない(上の「ページの任意の箇所を変換対象外とする」)のではなく、そのURLが指定されたら、このスクリプトを介さずに直接そのURLに移動したい、ということですね。
そう言えばそういう機能は用意してなかったなあ…。

掲示板のURLは、PC用も携帯用も同じですか?(あるいはPC用のURLに携帯からアクセスしたら自動的に携帯用のURLにリダイレクトされますか?)それなら簡単な修正で済みますが。これが異なってるとURLの書き換え処理も用意しないといけない罠。

あるいは、もし掲示板のテンプレートが変更可能で、Mobile Link Discovery(MLD)が追加できるなら(あるいは既に対応しているのなら)、このスクリプトはMLD(のURL)を取得するようにしてあるので、Template.inc.phpにMLDにリダイレクトする処理を追加するだけで済むし、MLDに対応しているGoogleなどのSEO対策にも有利だとは思いますが。

そのあたり、いかがでしょう?

※MLDについては以下あたりをご覧ください。
http://www.sixapart.jp/docs/tech/mobile_link_discovery_ja.html
http://blog.bulknews.net/mt/archives/002076.html

Posted by ucbさん at 2006/12/01 12:31

即答有り難うございます。
> 単にリンクを変換しない(上の「ページの任意の箇所を変換対象外とする」)のではなく、
> そのURLが指定されたら、このスクリプトを介さずに直接そのURLに移動したい、ということですね。

その通りです。
仰っているように掲示板はMLDを設置すれば問題ないと思いますがテンプレ修正が面倒なのと構造が複雑になりすぎる(携帯だけでなくPDA用もある)、別途レンタルブログサイトともリンクしているため問題が生じています。

ちなみに私の場合、掲示板とレンタルブログに関しては両方ともPC用と同じ物です。

もしよければプログラムから抜け出す事が出来るように開発してもらえませんか?
結構私みたいにCGI系でここに対応できていて、サイトページのみ対応したいって言う人いると思うのですが・・・

Posted by 名無しさん at 2006/12/01 14:33

バージョン0.9.21となってるものをどーぞ。
http://sourceforge.jp/projects/pc2m/

手抜きで説明を端折ってますが、Config.inc.phpの「変換せずに直接アクセスするURL」とあるところの$urls_to_redirect配列を、「アクセス先の制限」のところのと同じ要領で指定してください。

なお、このバージョンから規定の内部エンコーディングがUTF-8になってるのでご注意ください(詳細はREADMEで)。

Posted by ucbさん at 2006/12/01 20:53

ありがとうございます
早速試してみます。

Posted by 名無しさん at 2006/12/01 22:59

ただ今、DLして自分の環境にセットアップ中ですが1つ確認させて下さい。

> Config.inc.phpの「変換せずに直接アクセスするURL」とあるところの
> $urls_to_redirect配列を、「アクセス先の制限」のところのと同じ要領で指定してください。

と言われていますが、Config.inc.phpの中には「変換せずに直接アクセスするURL」という項目は無いですが・・・

また$urls_to_redirect配列を、色々なパターンで検索で探してみましたが見つかれませんでしたが、何処にあるのでしょう。

申し訳ないですが具体的なファイル名と行番号を教えて下さい。

Posted by 名無しさん at 2006/12/02 00:00

自己解決しました

Posted by 名無しさん at 2006/12/02 00:10

ん?前のバージョンでやってたとか?

Posted by ucbさん at 2006/12/02 00:51

確認です。
下の設定でサイト内の掲示板には正常にスプリットから抜け出せましたが、レンタルブログやリンク集先の抜け出しがうまくいきません。何処をどういう形にしたらいいか教えて頂きたい。

/* [書式]
* $urls_to_redirect = array (
* array(
* 'ホスト',
* array(
* 'パス1'
* 'パス2'
* )
* )
* );
*/

$urls_to_redirect = array(
array(
'.s58.xrea.com',
array(
'/x/c-board.cgi',
)
),
);

Posted by 名無しさん at 2006/12/02 03:29

と言われても、具体的な設定や対象のURLとか教えてもらわないとなんとも。

なお念のため上の例だと、「(なんとか).s58.xrea.com/x/c-board.cgi」というURLに全部マッチしちゃいますよ。

Posted by ucbさん at 2006/12/02 12:13

情報足らずで済みません。
当方管理しているHPサイトがxreaの無料レンタルで、サイトURLがdohiron.s58,xrea.comの為、掲示板は以前書いた設定にしました。
しかしならがら、当方のリンク集からサイト外のリンクを開いた時に、レンタルの為サーバー負荷軽減するためにも、
スプリットから抜け出したかったので色々試してみたのですが駄目でしたので確認の意味で書き込みさせて貰いました。

基本的にスプリットから抜け出したい物はdohiron.s58,xrea.comの掲示板とdohiron.s58,xrea.com以外のサイト(別ホスト?)です。
掲示板のURLはdohiron.s58.xrea.com/x/c-board.cgiです。

乱筆で申し割けございませんがよろしくお願いいたします。

Posted by 名無しさん at 2006/12/03 00:03

やっとやりたいことがわかったり。

仕様を微妙に変更&バグもあったので改修しました。SourceForge.jpで0.9.21.1となってるのを落っことしてpc2m.php(だけ)を入れ替えてください。

で、細かい説明はさておき。
やりたいことに鑑みて、Configの記述は以下でいい筈。

define('RESTRICT_URL', true);
$allowed_urls = array(array('dohiron.s58.xrea.com'));
$urls_to_redirect = array(array('dohiron.s58.xrea.com', array('/x/c-board.cgi')));

これで、dohiron.s58.xrea.com以外のURLにアクセスしようとすると「管理者によって制限されてます」メッセージになります。そして、dohiron.s58.xrea.com/x/c-board.cgiについては、変換せずにそのURLにリダイレクトします。

説明。
$allowed_urlsの指定に“ない”URLは変換されません。こうしたURLにアクセスしようとすると「制限されてます」メッセージが表示されます。
$urls_to_redirectに“ある”URLも変換されません。しかしこちらはメッセージを表示せず、そのURLにリダイレクトします。
いずれか一方しか利用しない場合でも、定数RESTRICT_URLはtrueにしておく必要があります(0.9.20では、$urls_to_redirectのほうはこの定数とは無関係でしたが、変更になりました)。

Posted by ucbさん at 2006/12/04 14:20

レスが遅くなり申し訳ないです。
修正&助言有り難うございます。
取りあえずうまくスプリットから抜け出すことが出来ました。有り難うございました。
強いて言えば管理者警告なしに、リンク先に飛べればいいのですが無理ですよね??
無理なようであればテンプレのコメント修正して使用させていただきます。

Posted by 名無しさん at 2006/12/05 10:59

外部へのリンクを踏んで(警告なしに)いきなりPC向けのウェブページがそのまま表示されてしまうのは、一般的には不親切だと思われるので、ダブってるっぽいですが、警告なしにリダイレクトするURLは別途に明示的に指定するようにしています。

812~813行目を、818~819行目と同じに変更すれば、変換対象外のURLも警告なしにリダイレクトされるようになります。

Posted by ucbさん at 2006/12/05 12:45

何度も対応していただき有り難うございます。
無事に本体の指定行を変更したら警告なしでいけました。
同サイト外へのリンクはテンプレに注意書きしておきたいと思います。
長くつきあっていただき有り難うございました。

Posted by 名無しさん at 2006/12/05 13:38

今回はじめて書込みさせてもらいます。
最後の方と同じ様な仕様で設置していますがちょっと悩んでます。
当方忍びのアクセスログでアクセスログを取っているものですが、
イメージアクセスが当HPサーバではなく忍びのサーバになるため、
最後の方と同じ設定(ホストは違う)だと外部サーバーが読めなくなります。
Config.inc.phpのコメント部を読んで色々試したりですがうまくいきません、最後の方のアクセス先の制限の部分をどのように追加すればよいのでしょうか。
ちなみにソースは<SCRIPT src="http://j*.shinobi.jp/ufo/*********"></SCRIPT>
<NOSCRIPT><A href="http://x*.shinobi.jp/bin/gg?*********" target="_blank"><IMG src="http://x*.shinobi.jp/bin/ll?*********" border="0">
</NOSCRIPT>
になり、Javaに対応していなくても良いようになっています。
お忙しいとは思いますがよろしくお願いいたします。

Posted by 名無しさん at 2006/12/08 15:54

遅レスですんません。

shinobiの仕組みがわかってないので推測。
(JavaScriptに非対応のブラウザでは)IMGタグの画像ファイルの読み込みがキーになってる筈なので、この画像が携帯にも対応してるのであれば、上の名無しさんのようなパターンではなく、もっと単純に、shinobiの画像を貼ってる箇所を、変換処理の対象外にすればいいだけのではないでしょうか?(<!--pc2m_remain--><a href=~><img src=~></a><!--/pc2m_remain-->)

Posted by ucbさん at 2006/12/11 16:34

レスが遅れて(*_ _)人ゴメンナサイ

そう言えばその方法がありましたね(;^_^A アセアセ・・・
一応その方法で対処しますがパケットサイズの関係もあるので出来ましたらご伝授下さい。

仕組み的には*がすべて同じ数字羅列(ログを取りたいページ毎に違う)で、
javaが使えないブラウザの場合CGI系を使いランダムに画像が呼び出される仕組みになっているみたいですがこれで解りますか??。


お手数をおかけしますが、よろしくお願いいたします

Posted by 名無しさん at 2006/12/13 11:00

とりあえず以下で、shinobi.jpドメインのすべてのページ/画像はリダイレクトされてオリジナルがそのまま表示される筈ですが、これで上手くいかなかったり?

define('RESTRICT_URL', true);
$urls_to_redirect = array(array('.shinobi.jp'));

もし、カウンターの画像だけオリジナル表示で、それ以外のshinobi.jpドメインのページ/画像は変換表示したいということなら、ホスト名に加えてカウンター画像のパスも書いておけばいいかと。

Posted by ucbさん at 2006/12/13 13:20

ありがとうございます。
忍びはもう少し解読が必要みたいなので、上の名無しさんの方法でpc2m本体を変更し管理警告出さない方法にしたら、ログが忍びでとれるようになりました。
ただ私の場合警告も出したいので、試行錯誤してみます。

Posted by 名無しさん at 2006/12/14 11:00

はじめて投稿させていただきます。

まずは、お礼を。
pc2mを大変便利に活用させていただいており、感謝しております。このような便利なものを公開していただき、ありがとうございます。


本題の質問は「端末判定」に関してです。
本ページに記載されている方法を参考に

require_once 'ClientDetect.class.php';
$client =& new ClientDetect();
var_dump( $client->dev_type ); // キャリア名(?)

と実行したのですが、携帯からのアクセスも全ての結果が
「string(7) "mozilla"」
と表示されてしまい困っております。
お知恵をお貸しいただければ幸いです。

ちなみにサーバの環境は、EUC-JP。
OSはES4です。

文字コードが一番怪しいかな~っと思って探ったりはしてみたのですが、解決せず書き込ませていただいた次第です。
宜しくお願い致します。

Posted by lifegoodさん at 2007/02/26 19:39

そりはまた面妖な。
このクラスは2バイト文字とは無縁なので文字コードは関係ないです。

判定の第一歩はユーザエージェントなので、クラスのコンストラクタの先頭を以下のように変えて、そこでユーザエージェントをvar_dumpしてみておくんなまし。

function __construct()
{
// ここから追加
var_dump($_SERVER['HTTP_USER_AGENT']);
// ここまで追加
$this->user_agent = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_AGENT']: '';

ちなみにPHP用の端末判定クラスには、PEARのNet_UserAgent_Mobileという、もっとちゃんとした(より正確で、より多くの情報が取れ、ちゃんとメンテされてる)のがありますです。
http://pear.php.net/package/Net_UserAgent_Mobile

Posted by ucbさん at 2007/02/26 20:41

お早いご回答ありがとうございます。

教えて頂いた形でUser Agentを出力し、内容を比べてみました。
以下、「var_dump($_SERVER['HTTP_USER_AGENT']);」の結果です。

■PCでのアクセス時
string(89) "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10"

■SoftBank
string(143) "Vodafone/1.0/V703SH/SHJ001 Browser/UP.Browser/7.0.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Profile/JSCL-1.2.2 Ext-V-Profile/VSCL-2.0.0"

■Docomo
String(32) "DoCoMo/2.0 F902i Cc100;TB;W23H12"

■AU
String(45) "KDDI-SN38UP.Browser/6.2.0.11.2(GUI)MMP/2.0"


UserAgentは問題なく取得出来ているように見受けられました。
であるのであれば、設定(Config.inc.php)などの問題なのでしょうか・・・

ちなみに、「Config.inc.php:User-Agent」については、以下のようになっております。
確かデフォルトのままです。

/* -------------------------------------------------------------------------
User-Agent
------------------------------------------------------------------------- */

/* スクリプトがサイトにアクセスする際のUser-Agent(HTTP_USER_AGENT)です。
* サイトによってはこの内容によって表示内容が変わる場合があります。
* 未定義の場合はPEARのHTTP_Requestの既定のものが使われます。
*/

define(
'PEAR_USER_AGENT',
'Mozilla/5.0 (compatible; PEAR HTTP_Request class; http://www.rcdtokyo.com/pc2m/)'
);

/*


教えて頂いたPEARの端末判定を利用するのもやぶさかではありませんが、

本pc2mをメインスクリプトとして使用している関係上、端末判定が運用面で問題にならないかという点が、やはり心配の種となってしまいます。

何かお知恵をいただければ幸いです。

Posted by lifegoodさん at 2007/02/27 16:13

このクラスはConfigとは無関係です(Configで設定するユーザエージェントは、PC2M自身がアクセス先のサイトに飛んでく際のもの)。

さて、ユーザエージェントの認識がヘンなことになってるわけじゃあないですね。
そうなると処理を逐次おっかけていくしかない。

コンストラクタを以下とまるまる入れ替えて、if~elseごとにvar_dump()。
さらに処理の最後にもvar_dump()してみるとどないでしょう。

function __construct()
{
$this->user_agent = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_AGENT']: '';
if (0 === strpos($this->user_agent, 'DoCoMo/')) {
$this->_detectDoCoMo();
var_dump('_detectDoCoMo', $this->dev_type); // 追加
} elseif (isset($_SERVER['HTTP_X_JPHONE_MSNAME'])) {
$this->_detectJPhone();
var_dump('_detectJPhone', $this->dev_type); // 追加
} elseif (preg_match('/\bUP\.Browser\b/s', $this->user_agent)) {
$this->_detectUPBrowser();
var_dump('_detectUPBrowser', $this->dev_type); // 追加
} elseif (preg_match('/\b(?:WILLCOM|DDIPOCKET)\b/s', $this->user_agent)) {
$this->_detectWillcomPCSV();
var_dump('_detectWillcomPCSV', $this->dev_type); // 追加
} elseif (isset($_SERVER['HTTP_X_WAP_PROFILE'])
or isset($_SERVER['HTTP_PROFILE'])) {
$this->_detectMiscMobile();
var_dump('_detectMiscMobile', $this->dev_type); // 追加
} else {
$this->_detectMisc();
var_dump('_detectMisc', $this->dev_type); // 追加
}
$this->_detectHost();
$this->_detectAcceptCharset();
$this->_detectAccept();
$this->_overrideGraphicSupport();
$this->_overrideScreenSize();
$this->_overridePreferredMarkup();
var_dump('Final Result', $this->dev_type); // 追加
}

Posted by ucbさん at 2007/02/27 16:56

度重なるご回答ありがとうございます。
細かくvar_dumpの箇所まで指定していただいて・・・

まずは結論から。。
処理を追いかけた結果の結論としましては、pc2m自体には何ら問題はございません。
ご迷惑おかけしました。


アドバイスの中にあった
(Configで設定するユーザエージェントは、PC2M自身がアクセス先のサイトに飛んでく際のもの)。
という点がまさに原因でして。。
変換対象側のサイトで端末判定処理を実現しようとしたため、同事象が発生していた事が判明いたしました。

なるほどなるほど、
pc2mは仮想Agentがサイトを閲覧した結果を変換しているような処理になっていたのですね(驚)
勉強不足でした

■変換前のvar_dump
string(15) "HTTP_USER_AGENT"
string(143) "Vodafone/1.0/V703SH/SHJ001 Browser/UP.Browser/7.0.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Profile/JSCL-1.2.2 Ext-V-Profile/VSCL-2.0.0"

string(13) "_detectJPhone"
string(8) "vodafone"

string(12) "Final Result"
string(8) "vodafone"

■変換後のvar_dump
string(15) "HTTP_USER_AGENT"
string(80) "Mozilla/5.0 (compatible; PEAR HTTP_Request class; http://www.rcdtokyo.com/pc2m/)"

string(11) "_detectMisc"
string(7) "mozilla"

string(12) "Final Result"
string(7) "mozilla" string(7)


とはいえ、変換対象側で端末判定をしなければならない事情に変わりはないのです。。
(メール用テンプレートの切替など)

PC版であれば、SESSIONに放り込んでハイOK。ってなノリなんですけどね~
何か妙案などがあればヒントをいただけませんでしょうか?
宜しくお願いいたします。

Posted by lifegoodさん at 2007/02/27 21:02

(1)実端末→(2)PC2M→(3)なんかウェブアプリ

こういう構成になってて、(3)にClientDetectクラスを仕込んで(1)の端末種別を判定し、表示を切り替えたいということですね。

■方法その1
PC2Mのユーザエージェントなどなどを実端末と同じものになるように改造する。ただしこの場合は(受け側のウェブアプリと同様に)端末によって表示を切り替えるサイト(YahooとかGoogleとか)ではケータイ版に飛ばされます。

■方法その2
PC2Mがリモートサイトにアクセスする際のHTTPヘッダに、X-Original-Devtypeとかテキトーにでっちあげた値を追加し、$client->dev_typeの値がそこに仕込まれるように改造。受け側のウェブアプリはその値を使って機種を判定する(ClientDetectは使わない)。

dev_typeの値以外は無用なのであれば、2のほうがお勧めかなあ。他のサイトに影響ないし。

この場合は、pc2m.php(v0.9.22)の944~947行目を以下のように変更(一行追加)。

array(
'X-Original-Devtype' => $client->dev_type, // この行を追加
'Accept-Charset' => 'Shift_JIS,utf-8;q=0.7,*;q=0.7',
'Accept-Language' => 'ja'
)

受け側のウェブアプリは、PHPなら以下のような感じで。

if (isset($_SERVER['HTTP_X_ORIGINAL_DEVTYPE'])) {
var_dump($_SERVER['HTTP_X_ORIGINAL_DEVTYPE']);
}

画面サイズとかその他もろもろClientDetectが本来取得する値も必要なら、同様にでっちあげのHTTPヘッダを必要な値ごとに追加していくか、1の方法をとるか。

Posted by ucbさん at 2007/02/27 22:35

追記。

Configのユーザエージェントの設定の後に、代替HTTPヘッダの設定がありますが、この選択肢のひとつ(配列の値)に実際の端末の値を突っ込んでおけば、ユーザが設定画面で切り替えることができるようにはなります(上の1の方法と同じになる)。
まあ、ユーザに切り替えてもらわなきゃいけないのでユーザビリティは劣りますが。

Posted by ucbさん at 2007/02/27 22:44

きめ細かいアドバイスありがとうございます。
お蔭様で、意図した事は全て実装することができました。

ご提示頂いた方法のうち、今回は
「■方法その2」
を使わせていただきました。

影響範囲も少なく、とても素敵です。
どうもありがとうございました。


蛇足とはなりますが、
今回教えて頂いた内容を元に携帯絵文字の対応をしてみましたので、情報共有までに簡単に以下にカキコしときます。


■引用ライブラリ
PHP 携帯絵文字 自動変換スクリプト
http://surf-style.us/manual2.htm

■PHP 携帯絵文字 自動変換スクリプの変更箇所
・Shift-JISのバイナリコード入力 → Unicodeのテキスト入力
・出力文字列作成部分のカスタマイズ

■pc2mの変更箇所
◆FormatRule.inc.php
・imgタグのAttributeの拡張

'img' => array(
'type' => 'inline',
'children' => array(),
//'attributes' => array('title', 'src', 'alt', 'name', 'height', 'width', 'align', 'border'),
'attributes' => array('title', 'src', 'alt', 'name', 'height', 'width', 'align', 'border', 'docomosrc', 'localsrc'),
'required_attribute' => 'src',
'docomo_attribute' => 'docomosrc',
'au_attribute' => 'localsrc'
),


◆pc2m.php(=index.php)
・function _checkAttributes($name, &$attribs) のカスタマイズ

function _checkAttributes($name, &$attribs)
{
if (!empty($attribs)) {

・・・・・

}

// add HERE
// case Docomo
if (isset($this->dtd[$name]['docomo_attribute'])
and isset($attribs[$this->dtd[$name]['docomo_attribute']])) {
return true;
}
// case AU
if (isset($this->dtd[$name]['au_attribute'])
and isset($attribs[$this->dtd[$name]['au_attribute']])) {
return true;
}
// END

・・・・・

}


・ 置換部分のカスタマイズ

if (preg_match_all('/(.+?)/si', $_content, $matches)) {
$limit = count($matches[0]);
for ($i = 0; $i ・・・)
// add HERE
if ($docomo_emoji = getAttribute("docomosrc", $matches[1][$i]))
{
$docomo_emoji = '

Posted by lifegoodさん at 2007/02/28 22:02

途中が切れてしまったので続きです。

・ 置換部分のカスタマイズ

if (preg_match_all('/(.+?)/si', $_content, $matches)) {
$limit = count($matches[0]);
for ($i = 0; $i ';
}
}

以上、ご参考までに。(かなり強引で正直お恥ずかしい限りですが・・・)

Posted by lifegoodさん at 2007/02/28 22:04

作者ですら二度とさわりたくねー、てゆうかなにがどうなってんだかもはや覚えちゃいねー(藁)なHTMLParserクラスをいぢられましたか。すげー。

いや貴重なコードありがとうございます、まじで。
残念ながらコメント欄では埋もれちゃうので、どっかにまとめておいていただければ、ご迷惑でなければそちらへのリンクを、もっとわかりやすいところに用意させていただきたいなと思ったり(原作者としてはあれこれ改造していただけるのはすごく嬉しいんですよ)。

Posted by ucbさん at 2007/03/01 14:46

せっかくおっしゃっていただいたので、ザックリまとめたものをアップしてみました。
http://d.hatena.ne.jp/lifegood/

見返してみて、もっとスマートに記述できたような気もしてますが・・・。
やっぱり力技すぎて恥ずかしい
これを糧にまた勉強をしないとなぁ~って感じです。


色々とアドバイスを頂き助かりました。どうもありがとうございます。

Posted by lifegoodさん at 2007/03/06 19:25

乙でーす。
さっそく上の本文にリンクを追加させていただきました。

Posted by ucbさん at 2007/03/06 22:48

xoops
で携帯対応をこころみているのですが、誰か方法をご教授ください。

現在、pc2m-0.9.22.1というものをダウンロードしまして、pc2m-0.9.22.1というフォルダをサーバーにアップロードしました。

で、データフォルダの属性を707にして、

pearpackというものダウンロードし、pc2m-0.9.22.1フォルダの中にHTTP.Net,XHLとPEAR.PHPをアップロードしました。

んでもってcheck.phpで動作確認をしましたがまぁ大丈夫かと。

でサイト名/pc2m-0.9.22.1/pc2m.phpを開くと単純な検索画面とgoogleとかのリンク画面があるだけです。

そこからどうしたらよいかわかるかたいますか?

Posted by blueeyeさん at 2007/03/26 17:10

> blueeyeさん

それで設置は完了している筈です。
あとはカスタマイズすべきところをカスタマイズしていってください。

まずConfig.inc.php(設定ファイル)をテキストエディタで開いて、そのコメントを参照しながら変更する箇所を変更していってください。
自身のXOOPSサイトの携帯対応が目的なら、まずはこのページの最初の「URLについて」で説明している内容を変更することになるでしょう。

Posted by ucbさん at 2007/03/26 18:05

早速の解答ありがとうございます。

DEFAULT_URLにXOOPSurlを書き込み、frontpage.inc.phpを削除すると次のように表示されるだけです。

「Frontpage.inc.phpの読み込みに失敗し、定数DEFAULT_URLも定義されていないかConfig.inc.phpの読み込みに失敗しました」

どうしたらよろしいのでしょうか?

Posted by blueeyeさん at 2007/03/27 10:34

お世話になります。使わせていただいております。
FORM要素のCHECKBOXなのですが、

①pc2m経由でAU携帯にてアクセスすると、うまく動作しません。(checkboxをチェックしても、その状態が次ページに引き継がれません)
②pc2m経由でDOCOMO携帯でアクセスすると正常に動作します。
③pc2m経由でなく、直接ページにAU携帯でアクセスすると、正常に動作します。

_check.phpでは、以下の警告(赤MSG)が出ていますが、問題だとは思っていません。
・OpenSSL: is not loaded
・GD GIF Create Support: NG

googleで検索しても、解決方法がわからず、こちらに書き込ませていただいた次第です。何かヒントでもいいので、与えてもらえればと思います。

よろしくお願いします。

Posted by ryoさん at 2007/03/27 23:28

すいませんでした。解決いたしました。サイト内のコメントを見るとちゃんと書いてありました。

たぶん、//を削除するとできました。と思います・・・。これからカスタマイズしてみます。楽しみがまたできました。

これからもよろしくお願いします。不必要なコメントは削除しといてください。

Posted by blueeyeさん at 2007/03/28 09:56

ぜんぜん違ってたようです。削除してください。すいません。

Posted by blueeyeさん at 2007/03/28 10:27

>ryoさん

期待通りに動作しないURLの例を晒してくれるとありがたいです。

checkboxについての既知の不具合としては、Gmailのメールの一覧表示がそうなのですが、複数のcheckboxに同じnameが振られているような場合、値が認識されるchekboxはひとつだけです(フォームを処理するサーバ側のアプリケーションがPHPで製作されている場合にしばしば用いられる、鉤括弧を使った「check[]」というようなトリックも同様)。

Posted by ucbさん at 2007/03/28 13:36

>blueeyeさん

うまくいってなによりです。
コメント削除しておきましょうか?別段不都合な内容はないと思われ、こちらも残しておいて問題はありませんけど。

Posted by ucbさん at 2007/03/28 13:37

いいえ。先ほどの方法ではまったく解決しなかったので、ご情報になると思いますので削除しておいた方がいいとおもいまして。

あいかわらず、現在は文字化けだらけでトップページが表示されません。

Posted by blueeyeさん at 2007/03/28 17:33

あ、解決してないのね…。文字化け?

■確認その1。
PC2Mにアクセスすると、DEFAULT_URLで指定したXOOPSのURLは表示されますか?(URL入力欄にそのURLが表示されますか?)

■確認その2。
文字化けはどのような感じになっていますか?PCのウェブブラウザでアクセスして文字化けていれば、ブラウザの文字エンコーディングを変更して読み取れる状態になる文字エンコーディングは何ですか?

Posted by ucbさん at 2007/03/28 19:25

自己解決いたしました。

修正前は

だったのですが、
修正後は

としたところ、うまくいきました。
value属性を設定するのがミソだったようです。
PC、Docomoは設定せずともチェックした状態が持ちまわれたのに、AUは駄目なんですね。

お騒がせしました。

#これで野球チームの出欠サイトが携帯対応できます。

Posted by ryoさん at 2007/03/28 23:33

string(25) "http://butu2sns.hippy.jp/"
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at サイト名/web/pc2m.php:40) in サイト名/web/pc2m.php on line 238

などのsessionに関する警告と

Warning: Cannot modify header information - headers already sent by (output started at サイト名/web/pc2m.php:40) in サイト名/web/pc2m.php on line 246

などの警告が出ています。

いろいろと調べてみたのですが、どうしてもわかりません。ヒントでもあればよろしくお願いします。

Posted by blueeyeさん at 2007/03/29 17:27

あ!返信いただきました確認事項ですが、いろいろと触っていると警告が変わり、確認事項1のXOOPSurlは表示されているのですが、確認事項2の文字化けはなくなり、それ以前に警告だけになってしまいました。

Posted by blueeyeさん at 2007/03/29 17:31

「headers already sent by」云々というエラーメッセージは、スクリプトが出力を開始しようとしたときに、既に出力が開始されていて、いまさら変更できませんよ、というものです。
で、この既に開始されている出力とはなにかというと、最初のWarningの前に表示されている「string(25) "http://butu2sns.hippy.jp/"」という文字列の出力のことを指していると思います。
スクリプトをいじくったときに、どこかに「var_dump」などと書いて、そのままになっていませんか?それを探して削除すれば、とりあえずこれらのエラーメッセージは消え去る筈です。

Posted by ucbさん at 2007/03/29 19:53

すいません。いろいろと解答していただいたのに申し訳ないのですが、私には使いこなせないのであきらめます・・・。

また上達したらやってみますので、コメント削除しといてください。

Posted by blueeyeさん at 2007/03/30 12:24

お久し振りです。

その後、快調に動いてくれています。
設置サイトとしてもご紹介頂きありがとうございます。

また質問で申し訳無いのですが、アクセス制限を掛けた場合の、制限された環境下での表示の変更は、どこをいじれば変更出来るのでしょうか?
Yahoo!のjigからのアクセスが多く、それ向けに表示を変更したいのですが…(^^;

Posted by Flash Mausさん at 2007/03/30 19:26

ええっと。

1.携帯以外をアク禁にしていて、jigブラウザWEBなどアク禁対象からのアクセス時に表示されるメッセージを変更したい?
2.jigブラウザWEBでアクセスしてきた場合の表示(テンプレート?本文?)を変更したい?

どっちでしょ?あるいはそれ以外?

Posted by ucbさん at 2007/03/30 20:40

いろいろとお世話になっております。

まだがんばってまして・・・。トップページは文字化けなく表示されるようになったのですが、(原因はまだはっきりしてません。申し訳ありません。)トップページの検索の部分
「検索枠丁E/a>」とフッターのところの「丁E/a>?E/a>直履TOP」だけがこのような感じに文字化けします。

解決策がありましたらよろしくお願いします。

Posted by blueeyeさん at 2007/04/01 07:41

すいませんでした。readmeにちゃんと書いてありました。

Posted by blueeyeさん at 2007/04/01 19:54

解決?したようでなにより。

Posted by ucbさん at 2007/04/02 12:14

ご返答ありがとうございます。

基本的に1ですが、他のjigやぐるっぽなどからのアクセスも多いので、
PCサイト変換サービスサイト経由でのアクセスだけ、更に表示が変更出来たなら理想的です。

Posted by Flash Mausさん at 2007/04/02 15:38

携帯以外規制の出力は(v0.9.22.1なら48~49行目の)以下の箇所。

header("$_SERVER[SERVER_PROTOCOL] 403 Forbidden");
exit("$_SERVER[SERVER_PROTOCOL] 403 Forbidden");

ここは特に決まりごとがあるわけではないので、規制時の表示内容を変更するだけなら、これをいかようにでも変えてくれればいいです。
ここに(もっとちゃんとした)メッセージを直書きするもよし、外部ファイルをincludeするもよし、別のURLにリダイレクトするもよし(いずれも最後にexitするのはお忘れなく)。
ちなみに、ここに設置してあるものは、規制理由の説明ページにリダイレクトするようになってたりします。

余談ですがGoogleの変換串(GWT)は、Mobile Link DiscoveryがあるとそのURLにリダイレクトする仕様なので、これを利用してGWT経由のアクセスを回避することができます(このサイトはそうなってたりします)。

Posted by ucbさん at 2007/04/03 14:06

ありがとうございます。

表示しているURLを取得してQRコードやメールで送信出来る形にしたいのですが、$remote_urlを指定したのでは取得は出来ないですよね?
何か方法はありませんでしょうか?

Posted by Flash Mausさん at 2007/04/04 23:21

規制を判定している時点では$remote_urlはまだ計算してませんからね。
$_SERVER['REQUEST_URI']でいいのでは?

$url = "http://pc.3ne.biz$_SERVER[REQUEST_URI]";
$qr = 'http://www.it-top.biz/qr/qrapi/?d='.urlencode($url);

Posted by ucbさん at 2007/04/05 13:15

お久しぶりです。現在表示もできいろいろとカスタマイズしているのですが、質問してもよろしいでしょうか?

xoopsでサイトを構築しているのですが、xoopsのトップページのhtmlを書き換えると表示非表示ができるのですが、モジュールなどのテンプレートの表示の非表示などのカスタマイズはできるのでしょうか?

テンプレートをいじっても何も表示が変わりません。こういうものなのでしょうか?

またブロックの表示 非表示をカスタマイズすることはできるのでしょうか?

Posted by blueeyeさん at 2007/04/05 22:38

以下の様に変更したのですが、ブラウザがきちんと表示してくれません。
何がいけないのでしょうか?
何度も申し訳ありません。
$client = new ClientDetect();
$url = "http://pc.3ne.biz$_SERVER[REQUEST_URI]";
$qr = 'http://www.it-top.biz/qr/qrapi/?d='.urlencode($url);
if (((defined('ALLOW_ONLYMOBILE') and ALLOW_ONLYMOBILE === true)
or (defined('RESTRICT_MOZILLA_AGENT') and RESTRICT_MOZILLA_AGENT === true))
and !$client->is_mobile) {
if (!isset($exclude_iprange) or
!$client->_compareIp($client->_dumpAddress($_SERVER['REMOTE_ADDR']), $exclude_iprange)) {
header(" >Flash Maus - 完全無料フルブラウザ 携帯以外からのアクセスは、このページが表示されます。Yahoo!のモバイル検索や他のフルブラウザサービスを利用し、このページに訪問された方はに直接アクセスして下さい。[メールで送信][携帯でアクセスしたいURLを入力して下さい]");
exit(" >Flash Maus - 完全無料フルブラウザ 携帯以外からのアクセスは、このページが表示されます。Yahoo!のモバイル検索や他のフルブラウザサービスを利用し、このページに訪問された方はに直接アクセスして下さい。[メールで送信][携帯でアクセスしたいURLを入力して下さい]");
}

Posted by Flash Mausさん at 2007/04/05 23:11

>blueeyeさん

おいらはXOOPSは殆どいぢってないヒトなので、いまいち意味が掴みかねるのですが、「表示非表示」とはなにを指しています?
このページにあるpc2m_voidや自動トリミングを使った、変換時の表示箇所の指定なら、テンプレートをそれに応じて変更していただければよいだけなのですが(ただXOOPSってテンプレいぢるの結構面倒じゃなかったっけ?)

Posted by ucbさん at 2007/04/06 20:56

>Flash Mausさん

ブラウザが表示してくれないのはheader関数の使い途が違うからでしょう。
オリジナルが、header関数とexit関数のパラメータが同じなので紛らわしいですが、headerはステータスコードやContent-TypeなどのHTTPヘッダを返すものです。
http://www.php.net/header

オリジナルにあるheaderは、アク禁を示すステータスコード403 Forbiddenを返すもので、これはこのままでも構いませんし、ステータスコードとしてもそれが最適ではあるのですが、しかし馬鹿なInternet Explorerは、デフォルトの設定ではエラーを示すステータスコード(400以上)を受け取ると、サーバが返すエンティティボディではなく、IE独自の「ページが表示できません」ページを表示しやがります。
従ってIE相手に意図通りの内容を表示したい場合は、エラーだろうがなんだろうが200 OKを返してやる必要があり、PHPではステータスコードの指定を省略すると200 OKになるので、つまりこの場合、オリジナルにあるheaderは削除したほうが良いでしょう。
http://www.studyinghttp.net/status_code

なお、Content-Typeなどその他のHTTPヘッダが必要なら、それはそれで追記してください。
http://www.studyinghttp.net/header

あと。
$clientオブジェクトは直前に生成済みの筈なので、あらためてクラスを初期化する必要はありません。
$urlと$qrを初期化している箇所はアク禁の条件式の中に書いとかないと、アク禁対象ではない場合でも無駄に実行されちゃいます。
mailtoのbodyパラメータに渡すURLは(QRコード生成スクリプトのURLに渡すパラメータと同様に)URLエンコードしとかないと、URLと端末次第では困ったことになります。

Posted by ucbさん at 2007/04/06 21:03

え!テンプレいじってできるのですか?確かいじったけど変わらなかったんで・・・。
もう一度いろいろ試してみます。あのーそれとなぜかひらがなの「い」だけ文字化けするんですが、私だけでしょうか・・・?

>>こんな感じに・・・。例えば「よろしくお願>>たします。」みたいに。

Posted by blueeyeさん at 2007/04/06 23:49

またまたすいません。全然違うテンプレート書き換えていたようです。本当にすいませんでした。

テンプレートの書き換えで可能でした。

Posted by blueeyeさん at 2007/04/07 01:11

ありがとうございます。

まだまだ未熟者で、いまいちピンとこなかった部分もありましたが、
お示し頂いた所を参照しながら、一番良策だろうと思われる形で落ち着かせる事が出来ました。

今現在 最後の質問ですが、
[REQUEST_URI]
の部分だけを取得させる様に、色々とやってみたのですが上手く行きません。
ご教授頂けたなら幸いです。

Posted by Flash Mausさん at 2007/04/09 10:14

>Flash Mausさん

$_SERVER['REQUEST_URI']の値は常に自動的に格納されるので、そのまま使えばいいわけですが。
http://www.php.net/reserved.variables

そういうことではなくて?

Posted by ucbさん at 2007/04/09 12:14

はい、例えば、
http://pc.3ne.biz/m.php?www.yahoo.co.jp
にパソコンでアクセスした場合、
http://pc.3ne.biz/pc/index.cgi?www.yahoo.co.jp
に飛ぶ様にしようかと…

まぁ~
http://pc.3ne.biz/pc/m.php?www.yahoo.co.jp
でもQRコードが表示される様にすれば良い訳ですが、なんかスマートじゃ無い気がしまして…

Posted by Flash Mausさん at 2007/04/09 18:55

ああ、よーやく意味がわかりますたよ。要するに、$remote_urlと同じ値をここで取得したいのね。

PC2Mの受け取り得るURLのパターンは、このページの上の「URLについて」に列挙している5ヶですが、この全てから正しくURLを取得するのはかなーり面倒です。
やりたいことは、(前回書かれていた)exitで終了してしまうのに替えて、index.cgiにリダイレクトして、そっちでQRコードを表示したいということでしょう?それならREQUEST_URIをまるまるindex.cgiのパラメータとして渡せばいいだけだと思われ。

header('Location:http://pc.3ne.biz/pc/index.cgi?req='.urlencode($_SERVER['REQUEST_URI']));
exit;

Posted by ucbさん at 2007/04/09 23:50

ありがとうございます。

> header('Location:http://pc.3ne.biz/pc/index.cgi?req='.urlencode($_SERVER['REQUEST_URI']));
> exit;

これだと
http://pc.3ne.biz/pc/index.cgi?req=m.php?www.yahoo.co.jp
と転送されてしまいます。
header('Location:http://pc.3ne.biz/pc/index.cgi?'.urlencode($_SERVER['REQUEST_URI']));
とする事で
http://pc.3ne.biz/pc/index.cgi?m.php?www.yahoo.co.jp
には出来たのですが、m.php?が上手く外せないのです。

難しいものですね…

Posted by Flash Mausさん at 2007/04/10 00:16

要件を明確にしましょう。

私は、index.cgiにて携帯用のURLを、mailtoリンクとQRコードで表示したい、というように理解しています。
この理解が正しければ、index.cgiが必要とする情報は携帯用のURLであり、アクセス先のURL(上の例ではwww.yahoo.co.jp)自体が必要なわけではありません。携帯用のURLは、ホスト名(http://pc.3ne.biz)にm.phpへのアクセス時のREQUEST_URIを継ぎ足したものになりますから、即ちindex.cgiにはREQUEST_URIをそのまま引き渡せばよく、これがm.phpとindex.cgiの両方で最も簡単な処理である筈です。
そうではなく、アクセス先のURLだけを切り出す必要があるのなら、前述の通り、PC2Mが受け取り得る全てのパターンに対処するのはかなり面倒です。もちろん特定のパターンにだけ対処すればよいのなら事情は違いますが。

Posted by ucbさん at 2007/04/10 11:53

あ、そうですね。
無理に外さずに、index.cgiでm.php以降を受け取って出力させる形にすれば良いんですよね・・・
申し訳有りませんでした。
お騒がせしました。

Posted by Flash Mausさん at 2007/04/10 17:09

良い感じになりました。
何度もありがとうございました。

Posted by Flash Mausさん at 2007/04/10 17:56

またなにかありましたらお気軽に♪

Posted by ucbさん at 2007/04/10 20:49

おひしぶりです。いろいろとカスタマイズしているのですが、気づいてみるとドコモ903以降の携帯ではxoopsのモジュールの表示ができません。au携帯でもダメでした。自分の携帯は901シリーズで他の901シリーズでは問題ありませんでした。そういうものなのでしょうか?vodafoneでは確認しておりません。

Posted by blueeyeさん at 2007/04/12 10:07

キャリア/機種が異なっても基本的に表示される内容は同じです。
「XOOPSのモジュールの表示ができません」という、具体的な状況がさっぱりわかりませんが、どうなるということでしょうか?
もしあれなら、具体的なサイトを晒していただいたほうがわかりやすいのですが、直接ここで晒すのが憚られるようなら、以下宛てにご連絡いただいても結構です。
http://www.rcdtokyo.com/pc2m/note/archives/images/gmail.png

Posted by ucbさん at 2007/04/12 11:30

またまたすいません。

知り合いにpc2mの設置を頼まれたのですが、自サイトの変換のみの利用なんですが、
pc2mで変換したページに、パソコンからアクセスした場合に、変換前のページに飛ぶ様にしたいのですが、

> header('Location:http://pc.3ne.biz/pc/index.cgi?req='.urlencode($_SERVER['REQUEST_URI']));
> exit;

を上手く良い形に変更出来ません。
何か良い手があればご教授頂きたいのですが、よろしくお願いします。

Posted by Flash Mausさん at 2007/04/12 22:03

それはさすがに、クエリー文字列を解析してアクセス先のURLを取得する必要があります。

もっとも簡単なのはクエリー文字列のパターンをひとつに絞ってしまうことでしょう。PC2Mが取り得るクエリー文字列のURLのパターンは、このページの上の「URLについて」にある5通りですが、スクリプト自体が生成するURLはその最後のもののみです。このパターンならアクセス先のURLは、$_GET['_ucb_u']で確実に取得できるので、フロントページなどでの記述もこれに統一しておいて、このパターンでやってくる前提で$_GET['_ucb_u']にリダイレクトしてしまえばいいかと。

if (isset($_GET[KEY_PREFIX.'u']) and 0 === strpos($_GET[KEY_PREFIX.'u'], 'http')) {
header('Location:'.$_GET[KEY_PREFIX.'u']);
exit;
} else {
/* それ以外の場合の処理 */
}

クエリー文字列のパターン全てに対応する必要があるのなら、この時点では適当なグローバル変数を用意しておいて真偽値を与え、プログラム中のアクセス先のURLが確定した時点以降にその変数を参照して、そこでリダイレクトするという方法がよいかもしれません。

なお逆に、PC向けのページに携帯からアクセスしてきた場合の対処は上の「URLについて」に書いてあるので念のため。

Posted by ucbさん at 2007/04/13 22:44

ありがとうございます。

設置した所は、携帯のページのトップを、パソコン向けページのトップをデフォルトに設定しているので、$_GET['_ucb_u']では難しいかも知れません。

やっぱり一番無難なパソコン向けトップページに飛ばす様にしてみます。

後 多分、パソコンからのアクセスを禁止している場合のパソコンでの表示に関して、私以外にもニーズを感じている人が多いかと思いますので、新しいバージョンでは、簡単に設定出来る様にして頂けたなら嬉しいです。

Posted by Flash Mausさん at 2007/04/14 17:41

今回 http://i.3ne.biz/top/ という様なサービスを始めました。
この中で、 http://i.3ne.biz/top/html/ の文章は、こちらのページを転載させて頂いたのですが、問題有る場合には削除致しますがどうでしょうか?
作者の文章に私が敵う訳も無く、最良の方法かと思い転載致しました。
ご許可頂けたなら幸いです。

Posted by Flash Mausさん at 2007/04/19 12:28

URLを間違えました。
正しくは下記
今回 http://i.3ne.biz/pc/ という様なサービスを始めました。
この中で、 http://i.3ne.biz/pc/html/ の文章は、こちらのページを転載させて頂いたのですが、問題有る場合には削除致しますがどうでしょうか?
作者の文章に私が敵う訳も無く、最良の方法かと思い転載致しました。
ご許可頂けたなら幸いです。

Posted by Flash Mausさん at 2007/04/19 12:40

ぐるっぽさんちのSPICEのパターンっすね。

転載そのものはいかようにでもご利用いただければと。
ただこの文章は、HTMLを変更するハナシと、スクリプトを変更するハナシが混在してたりするわけですが(例えば「自動トリミング」や「imgタグについて」の項)。このサービスでは、サイトの管理者はスクリプトについては変更できないので、その点は変更する必要があるかと。

あとは、この文章はちゃんとメンテされてないので先日のタグペアのハナシみたいなのが漏れてたりしますし、この文章はPC2Mを設置する技量のあるひとを想定して書いてるので、わかり難かったり読み辛かったりする筈なので、そのあたり適宜変更いただいたほうがいいかもしれないなあとか。

Posted by ucbさん at 2007/04/19 16:32

ありがとうございます。

これで安心して転載した文章を載せておけます。

関係無い部分は取り合えず削除しました。
他の文章も、ぼちぼちと利用者が分かり易い文章に変更していきます。

Posted by Flash Mausさん at 2007/04/20 23:32

素晴らしいスクリプトありがとうございます。
現在、pc2mの導入を検討しているのですが、ページ内の任意の部分に特定のタグを入れて強制的に改ページさせるような機能というのはありますでしょうか。

もしくは、「ここを改造すればできるよ」というポインタでも結構です。

ご教授いただければ幸いでございます。

Posted by カリメロさん at 2007/10/03 12:35

残念ながら無いんですよ。分割の始点は設定できますが、終点を決めるのは端末のキャッシュサイズのみというコンセプトだったもんで。
分割処理自体はtrimContent()という関数の中にまとまってはいますが、この中身はかなりgdgdで、改造するのもかなーり面倒だと思います。
うーんどうしたもんかなあ…。

Posted by ucbさん at 2007/10/04 22:49

お礼が遅れました。
ご回答ありがとうございます。終点は端末のキャッシュサイズのみで決まるというコンセプトなんですね...。

<Hn>見出し</Hn>
<P>本文</P>

<Hn>見出し</Hn>
<P>本文</P>
:
:
と続くようなページの時に、見出しだけ分割前のページに残ってしまい、本文部分だけが次のページに行ってしまうということが起こってまして、何とか試行錯誤してみたいと思います。

Posted by 名無しさん at 2007/10/21 06:55

xreaにMovableをインストールしている者です。
ブログの携帯対応のため、MT4iを試しましたが、Xreaはサーバによっては、encodeがインストールされておらず、こちらにきました。
設定も簡単でとりあえず動作を確認したところです。

そこで、質問ですが、モバイルadsense の 広告を貼り付けるには、どのようにしたら良いのでしょうか?
ご教示ください。(既出ではないとおもいまして。。。)

Posted by 同じくxreaの住人さん at 2007/12/05 12:51

モバイルAdSenseって見たことないんで知らないですが、モバイル用のAdSenseコード(タグ?)をウェブページに貼り付けるんすよね?
だとしたら、フツーにテンプレート(Template.inc.php)のどこかに貼ればいいのではないかと思いますが、うまくいかないとか?

Posted by ucbさん at 2007/12/05 22:48

はじめまして自分のサイトを携帯でもアクセスできるよう、PC2Mを導入しまして使わせていただいています。以前はPCサイトを閲覧できる外部サービスを利用して携帯を対応させていましたが、PC2Mのおかげで自分のスペースで運営できるので気に入っています。

現在は、まだ動作確認段階ですがWeb変換も問題なく、DEFAULT_URLも指定して最後に自分のサイト以外変換させないよう

define('RESTRICT_URL', true);
$allowed_urls = array(array('*****.co.jp'));

をConfig.inc.phpのDEFAULT_URLの近くに書き込み、確認してみたのですが、指定のドメイン以外にもアクセス出来てしまいます…。自宅サーバならいいですが、都合で現在レンタルサーバーに移して運営しているので、余分なアクセスはさせたくありません。上記の内容で間違いないでしょうか?お時間があるときに
、ヒントをいただけると幸いです。

Posted by kreaさん at 2008/03/02 08:52

例えば*.google.co.jpしかアクセスを許可しない場合はこんな感じになります。
define('RESTRICT_URL', true);
$allowed_urls = array(array('.google.co.jp'));

なおConfig.inc.phpのコメント中「$allowed_url」となっている箇所がありますが、$allowed_urls(最後に「s」が付く)のが正しいので、一応ご確認ください。

うーん後はなんだろう?

Posted by ucbさん at 2008/03/13 13:20

コメントをどうぞ



保存しますか?