Powered by SmartDoc

mod_chxj

Last modified: Fri May 16 22:32:45 JST 2008
Atsushi Konno

目次

Overview

mod_chxjはオープンソースの携帯向けコンテンツ変換Apache2.x用モジュールであり、CHTML(DoCoMo i-Mode用CHTML5.0)で記述された文書や通常のHTMLで記述された文書を、アクセスに来た端末のUser-Agentヘッダを見て、それぞれの端末にあった形式に変換します。HTML文書に限らず、画像(jpg、gif、png)、絵文字についても、定義ファイルに従ってそれぞれのキャリアにあった絵文字に変換します。Cookie非対応端末、Refer非対応端末のために、Set-Cookie、CookieヘッダやRefererヘッダをシミュレートすることもできます。

インストール

準備

mod_chxjをインストールする前に、下記のものを用意する必要があります。

  1. Apache2.xのヘッダーファイル群
  2. Apache2.x用のapxs
  3. apr(Apache Portable Runtime)ライブラリとそのヘッダファイル郡(apu含む)
  4. automake、autoconf、libtool1.3.X
  5. ImageMagick(MagickWand)
  6. memcachedを使用する場合にはlibmemcached 0.20以降
  7. mysqlを使用する場合にはlibmysqlclient 4.1.11a以降
  8. Linux

mod_chxjの入手

mod_chxjはこちらからダウンロードすることができます。

インストール

以下にmod_chxjインストール手順を示します。

  1. Configureスクリプトを生成します

    Configure スクリプトの生成
    $ ./buildconf.sh
    

    (1)

  2. Configure

    Configure
    $ ./configure
    

    (2)(3)

  3. mod_chxj.soを生成します
    make
    $ make
    
  4. apacheにインストールします
    install
    $ make install
    
  5. データの設置etcディレクトリは以下のdevice_data.xmlとemoji.xmlをApacheからアクセスできるところに配置します。

    以下、/etc/apache2/chxjディレクトリにchxj用設定ファイルを用意する場合

    データの設置
    $ mkdir -p /etc/apache2/chxj
    $ cp etc/device_data.xml /etc/apache2/chxj
    $ cp etc/emoji.xml /etc/apache2/chxj
    
  1. "$"はプロンプトをあらわします。
  2. 場合によっては--with-apr-configや--with-apu-config、--with-pcre-configも必要です。
  3. 詳細はBuildを参照

Build

mod_chxjをコンパイルするにはconfigureを行う必要があります。以下にconfigureのオプションを記します。

メイン

--with-apache-header

通常指定する必要はありません。configureでApacheのヘッダファイルの場所が検知できなかった場合や、任意のApacheヘッダファイルを使用したい場合に指定します。

--with-apache-header
         $ ./configure --with-apache-header=/usr/include/apache2
      

上記は/usr/include/apache2以下にApacheのヘッダファイルがある場合の例です。

--with-apxs

通常指定する必要はありません。configureでapxsを検知できなかった場合や、任意のapxsプログラムを指定したい場合に指定します。

--with-apxs
         $ ./configure --with-apxs=/usr/local/apache2/bin/apxs2
      

上記は/usr/local/apache2/bin/apxs2を使用するようにapxsに指定しています。

--with-apr-config

通常指定する必要はありません。configureでapr-configを検知できなかった場合や、任意のapr-configプログラムを指定したい場合に指定します。

--with-apr-config
$ ./configure --with-apr-config=/usr/local/apache2/bin/apr-1-config
      

上記は/usr/local/apache2/bin/apr-1-configを使用するように指定しています。

--with-apu-config

通常指定する必要はありません。configureでapu-configを検知できなかった場合や、任意のapu-configプログラムを指定したい場合に指定します。

--with-apu-config
$ ./configure --with-apu-config=/usr/local/apache2/bin/apu-1-config
      

上記は/usr/local/apache2/bin/apu-1-configを使用するように指定しています。

Cookieシミュレート機能でMySQLを使用する場合

--enable-mysql-cookie

Cookieシミュレート機能を使用する際、保存先をデフォルトのDBMでは無く、MySQLに保存するようにします。DefaultのDBMで良い場合や、Cookieシミュレート機能を使用しない場合は指定する必要はありません。別途MySQLサーバを用意する必要があります。また、本オプションを指定した場合は、--with-mysql-header、--with-mysql-lib-dirも指定します。これはMySQLのヘッダとライブラリが必要なことを意味します。使用するMySQLのライブラリは今のところlibmysqlclient_r.soのみです。

--enable-mysql-cookie
$ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql \
    --with-mysql-lib-dir=/usr/lib
      

上記は、/usr/include/mysql以下にmysql用のヘッダがあり、/usr/lib以下にlibmysqlclient_r.soがある場合の例です。

--with-mysql-header

--enable-mysql-cookieを指定した場合は必須です。MySQLのヘッダファイルの場所を指定します。

--with-mysql-header
$ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql \
    --with-mysql-lib-dir=/usr/lib
      

--with-mysql-lib-dir

--enable-mysql-cookieを指定した場合は必須です。MySQLのライブラリ、libmysqlclient_r.soの設置されているディレクトリを指定します。

--with-mysql-lib-dir
$ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql \
    --with-mysql-lib-dir=/usr/lib
      

Cookieシミュレート機能でmemcachedを使用する場合

--enable-memcache-cookie

Cookieシミュレート機能を使用する際、保存先をデフォルトのDBMでは無く、memcachedに保存するようにします。DefaultのDBMで良い場合や、Cookieシミュレート機能を使用しない場合は指定する必要はありません。別途memcachedを用意する必要があります。また、本オプションを指定した場合は、--with-memcached-header、--with-memcached-lib-dirも指定します。これはlibmemcachedのヘッダとライブラリが必要なことを意味します。

--enable-memcache-cookie
$ ./configure --enable-memcache-cookie \
    --with-memcached-header=/usr/include/libmemcached \
    --with-memcached-lib-dir=/usr/lib
      

上記は、/usr/include/libmemcached以下にlibmemcached用のヘッダがあり、/usr/lib以下にlibmemcached.soがある場合の例です。

--with-memcached-header

--enable-memcache-cookieを指定した場合は必須です。libmemcachedのヘッダファイルの場所を指定します。

--with-memcached-header
$ ./configure --enable-memcache-cookie \
    --with-memcached-header=/usr/include/libmemcached \
    --with-memcached-lib-dir=/usr/lib
      

--with-memcached-lib-dir

--enable-memcache-cookieを指定した場合は必須です。libmemcachedのライブラリ、libmemcached.soの設置されているディレクトリを指定します。

--with-memcached-lib-dir
$ ./configure --enable-memcache-cookie \
    --with-memcached-header=/usr/include/libmemcached \
    --with-memcached-lib-dir=/usr/lib
      

Configuration

以下はmod_chxjが/usr/lib/apache2/modulesディレクトリ配下に設置されたものとしています

htmlファイルが変換対象の場合

例として、Locationが"/chxj"以下のものは全て変換する場合を説明します。

  1. httpd.confに以下を追加します。
    httpd.conf
    #====================================================================================
    # モジュールをApache2.xにロード
    #====================================================================================
    LoadModule chxj_module /usr/lib/apache2/modules/mod_chxj.so
    
    #====================================================================================
    # デバイスデータファイルの設定
    #====================================================================================
    ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml
    
    #====================================================================================
    # 絵文字データファイルの設定
    #====================================================================================
    ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml
    
    #====================================================================================
    # 変換エンジン動作指示命令
    # ChxjConvRule ==> ディレクティブ
    # "^/chxj.+$"  ==> Perl互換のURIパターン
    # EngineOn     ==> 変換エンジンを動作させる指示
    # NONE         ==> サーバ側の文字コード。(NONEを指定した場合は文字コード変換しない)
    #====================================================================================
    ChxjConvertRule "^/chxj.+$" "EngineOn" "NONE"
    
  2. apacheの再起動。

php等の出力結果が変換対象の場合

  1. httpd.confに以下を追加します
    httpd.conf
    #====================================================================================
    # モジュールをApache2.xにロード
    #====================================================================================
    LoadModule chxj_module /usr/lib/apache2/modules/mod_chxj.so
    
    #====================================================================================
    # デバイスデータの設定
    #====================================================================================
    ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml
    
    #====================================================================================
    # 絵文字データの設定
    #====================================================================================
    ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml
    
    #====================================================================================
    # 変換エンジン動作指示命令
    # ChxjConvRule ==> ディレクティブ
    # "^/chxj.+$"  ==> Perl互換のURIパターン
    # EngineOn     ==> 変換エンジンを動作させる指示。動作させたく無い場合は"EngineOff"
    # EUC-JP       ==> サーバ側の文字コード。(NONEを指定した場合は文字コード変換しない)
    #                  EUC-JPからCP932に文字コード変換します。
    #====================================================================================
    ChxjConvertRule "^/chxj.+$" "EngineOn" "EUC-JP"
    
  2. apacheの再起動。

xoopsを使用し、且つwordpress、bwikiを使用している場合

  1. httpd.confに以下を追加します
    httpd.conf
    #====================================================================================
    # モジュールをApache2.xにロード
    #====================================================================================
    LoadModule chxj_module /usr/lib/apache2/modules/mod_chxj.so
    
    #====================================================================================
    # デバイスデータの設定
    #====================================================================================
    ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml
    
    #====================================================================================
    # 絵文字データの設定
    #====================================================================================
    ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml
    
    #====================================================================================
    # 変換エンジン動作指示命令
    #====================================================================================
    #====================================================================================
    # bwikiの設定をします。bwikiではどうもxoopsヘッダの文字コードとbwiki内での携帯スキン
    # の文字コードが一致していないようなので、bwiki内で文字コードを変換させないように
    # 修正後、以下のルールを記述します。
    # 
    # ChxjConvRule           ディレクティブ
    # "^/modules/bwiki.+$"   このルールを適用したいURIパターン
    # "EngineOn"             変換エンジンを有効にします。
    # "EUC-JP"               出力時にEUC-JPからCP932に変換させます。
    # "PC"                   変換元HTMLはPCサイト用HTMLです。
    # "DoCoMo/1.0/D501i"     DoCoMo端末としてbwikiにアクセスさせます。
    #
    #====================================================================================
    ChxjConvertRule "^/modules/bwiki.+$" "EngineOn" "EUC-JP" "PC" \
        "DoCoMo/1.0/D501i"
    
    #====================================================================================
    # wordpressの設定をします。
    # 
    # ChxjConvRule               ディレクティブ
    # "^/modules/wordpress.+$"   このルールを適用したいURIパターン
    # "EngineOn"                 変換エンジンを有効にします。
    # "NONE"                     出力時に文字コード変換をさせません。
    # "NONE"                     変換元HTMLはPCサイト用HTMLではありません。
    # "DoCoMo/1.0/D501i"         DoCoMo端末としてwordpressにアクセスさせます。
    #
    #====================================================================================
    ChxjConvertRule "^/modules/wordpress/.*$" "EngineOn" "NONE" "PC" \
        "DoCoMo/1.0/D501i"
    
    #====================================================================================
    # その他の設定をします。
    # 
    # ChxjConvRule               ディレクティブ
    # "^/.+$"                    このルールを適用したいURIパターン
    # "EngineOn"                 変換エンジンを有効にします。
    # "EUC-JP"                   出力時にEUC-JPからCP932に文字コード変換をさせます。
    #
    #====================================================================================
    ChxjConvertRule "^/.+$" "EngineOn" "EUC-JP" 
    
    
    <Location />
      ChxjImageEngine On
      AllowOverride All
    </Location>
    
  2. apacheの再起動。

画像自動変換機能を使用する場合

  1. httpd.confに以下を追加します。下記は、URIが/imgで始まる全ての画像に対して動作するようmod_chxjに指示しています。

    httpd.conf
    <Location /img>
    ChxjImageEngine On
    ChxjImageCacheDir /tmp
    ChxjImageCopyright "A.Konno"
    </Location>
    

    上記の説明を以下に示します。

    1. ChxjImageEngine

      mod_chxjの画像変換ハンドラを起動するよう指示しています。DefaultはOff





    2. ChxjImageCacheDir

      mod_chxj画像変換ハンドラが使用する変換後の画像をおいておくディレクトリを指定します。デフォルトは/tmp。

      ChxjImageCacheDir
            ChxjImageCacheDir /tmp
            
      

      mod_chxjに画像変換キャッシュとして/tmpを使用するよう指示します。



    3. ChxjImageCacheLimit

      mod_chxj画像変換ハンドラが使用する変換後の画像をおいておくディレクトリの許容量を指定します。単位はbyte。

      ChxjImageCacheLimit
            ChxjImageCacheLimit 1024
            
      

      mod_chxjに画像変換キャッシュ最大サイズとして1kbyteと指定。※このとき変換結果が1kbyte以上あるような場合にはINTERNAL_SERVER_ERRORを返します。十分な領域を確保するか、画像サイズを小さくしてください。



    4. ChxjImageCopyright

      mod_chxjの画像変換ハンドラに、転送禁止設定を行うよう指示します。パラメータとして任意の文字列をとります。ChxjImageCopyrightディレクティブで指定された文字列は、それぞれのイメージのコメント部に埋め込まれます。

      ChxjImageCopyright
            ChxjImageCopyright "A.Konno"
            
      

      mod_chxjに転送禁止設定を行うよう指示しています。変換後イメージのコメント部分には、キャリア毎に以下の文字列を埋め込みます。

      AU の場合

      AU
             kddi_copyright=on,A.Konno
             
      

      DoCoMoの場合

      DoCoMo
      copy="NO",A.Konno
      

      SoftBank/Vodafoneの場合は、レスポンスヘッダに

      SoftBank/Vodafone/J-PHONE
               x-jphone-copyright:no-transfer
             
      

      を埋め込みます。(4)

  1. SoftBank/Vodafoneの場合は、リクエストURLの最後が.pnzか、.jpzで終わるようにダミーを付けなければなりません。

文字コードを変換したい場合(EXPERIMENTAL)

  1. httpd.confに以下を追加します。下記は、URIが/chxjで始まる全てのコンテンツに対して動作するようmod_chxjに指示しています。サーバ側はEUC-JPであった場合の例です。mod_chxjによってSJISに変換するように指示しています。サーバ側がShift_JISで無い場合は、Shift_JISコードの10進参照文字列表記を記述することによってShift_JISコードの絵文字2バイトコードに変換しクライアントへ返します。

    httpd.conf
    ChxjConvRule "^/chxj.+$" "EngineOn" "EUC-JP"
    

    上記の説明を以下に示します。

    1. ChxjConvertRule

      サーバサイドの文字コードを指定します。ここに、EUC-JPと指定してあった場合は、EUC-JPからCP932に変換後、クライアントに出力されます。省略した場合はNONE

      1. 変換エンジン動作指示命令

        ChxjConvertRule ==>ディレクティブ

        "^/chxj.+$" ==> Perl互換のURIパターン

        EngineOn ==>変換エンジンを動作させる指示。動作させたく無い場合は"EngineOff"

        EUC-JP ==>サーバ側の文字コード。(NONEを指定した場合は文字コード変換しない)



        EUC-JPからCP932に文字コード変換します。(glibc/iconvに依存します)





ディレクティブ

  1. ChxjLoadDeviceData

    デバイス定義ファイルを指定します。
    ex)
        ChxjLoadDeviceData /etc/apache2/device.xml
      
    
  2. ChxjLoadEmojiData

    絵文字変換定義ファイルを指定します。
    ex)
        ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml
      
    
  3. ChxjImageEngine

    画像変換エンジンを有効にします。パラメータとしてOnとOffを指定できます。DefaultはOffです。
    ex)
        ChxjImageEngine On
      
    
  4. ChxjImageCacheDir

    イメージの一時ファイル保存場所を指定します。
    ex)
        ChxjImageCacheDir   /tmp
      
    
  5. ChxjImageCacheLimit

    イメージの一時ファイル保存許容量を指定します。下記は1MByteの例。
    ex)
        ChxjImageCacheLimit   1048576
      
    
  6. ChxjImageCopyright

    イメージに著作権情報を付与します。
    ex)
        ChxjImageCopyright   "chosakuken jyoho"
      
    
  7. ChxjConvertRule

    HTML変換エンジンの適用ルールを記述します。本ディレクティブを使用し、変換エンジンのOn|Offを指定します。DefaultはOFFです。また、ルールは記述された順番に評価し、マッチするものがあれば、その時点で対象ルールを適用します。パラメータは3つ必要です。下記にパラメータを記します。
    パラメータ
    第1パラメータ URIを評価するPerl互換の正規表現を指定します
    第2パラメータ HTML変換エンジンのOn|Offを指定します。Onの場合は"EngineOn"。Offの場合は"EngineOff"を指定します。"EngineOn|EngineOff"の他に"CookieOn|CookieOff"を指定することもできます。複数指定する場合は","で区切って指定します。
    第3パラメータ 文字コードを指定します。ここで指定した文字コードから"CP932"に変換します。指定できる文字コードはiconv -lコマンドによって確認することができます。変換しなくて良い場合はNONEを指定してください。
    第4パラメータ 省略した場合は、携帯ページからの変換を意味します。PC用ページからの変換を行う場合は"PC"を第四パラメータに指定します。
    第5パラメータ サーバサイドアプリケーションに渡すUser-Agentを指定します。例えば、wordpress等のようにCHTMLを出力するアプリケーションがある場合は、"DoCoMo/1.0/N501i"等適当なUser-Agentを指定することによって、アプリケーションにCHTMLを出力するように指示することができます。ここで指定したUser-AgentはHTML出力時には評価されません。
    ex)
        ChxjConvertRule "^/chxj.+$/" EngineOn EUC-JP
      
    
  8. ChxjCookieDir

    クッキー保存先をdbmにする場合(デフォルト)指定します。クッキーの内容を保存するディレクトリを指定します。指定しない場合は/tmpに保存されます。

    ex)
        <Location />
          ChxjCookieDir   /tmp
        </Location>
      
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  9. ChxjCookieTimeout

    クッキーを使用する場合に指定します。クッキーの保持期間を秒単位で指定します。指定しない場合は、1800秒でクッキーデータを破棄します。

    ex)
        <Location />
          ChxjCookieTimeout 10
        </Location>
      
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  10. ChxjCookieStoreType

    クッキー保存先を指定します。指定できるものは以下のとおり。
    保存先
    意味 指定例
    "dbm" dbmを選択します。 ChxjCookieStoreType "dbm"
    "mysql" mysqlを選択します。有効にするにはconfigure時にMYSQL COOKIE機能を有効にする必要があります ChxjCookieStoreType "mysql"
    "memcache" memcacheを選択します。有効にするにはconfigure時にMEMCACHE COOKIE機能を有効にする必要があります ChxjCookieStoreType "memcache"
  11. ChxjCookieMysqlHost

    MySQLサーバの動作するホストを指定します。

    ChxjCookieMysqlHostの例
             ChxjCookieMysqlHost "localhost"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  12. ChxjCookieMysqlPort

    MySQLサーバのポート番号を指定します。

    ChxjCookieMysqlPortの例
             ChxjCookieMysqlPort 3306
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  13. ChxjCookieMysqlDatabase

    MySQLサーバのデータベース名を指定します。

    ChxjCookieMysqlDatabaseの例
             ChxjCookieMysqlDatabase "test_db"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  14. ChxjCookieMysqlUsername

    MySQLサーバに接続する際に使用するユーザ名を指定します。

    ChxjCookieMysqlUsernameの例
             ChxjCookieMysqlUsername "roottest"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  15. ChxjCookieMysqlPassword

    MySQLサーバに接続する際に使用するパスワードを指定します。

    ChxjCookieMysqlPasswordの例
             ChxjCookieMysqlPassword "pwtest"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  16. ChxjCookieMysqlSocketPath

    MySQLのソケットパスを指定します。

    ChxjCookieMysqlSocketPathの例
             ChxjCookieMysqlSocketPath  "/tmp/mysql.sock"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  17. ChxjCookieMysqlCharset

    MySQLのエンコードを指定します。

    ChxjCookieMysqlCharsetの例
             ChxjCookieMysqlCharset  "utf8"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  18. ChxjCookieMysqlTablename

    MySQLのクッキーを保存するテーブル名を指定します。

    ChxjCookieMysqlTablenameの例
             ChxjCookieMysqlTablename  "chxj_cookie"
          
    

    上記のように"chxj_cookie"と指定すると、実際に作成されるテーブルは、chxj_cookieとchxj_cookie_expireテーブルの2つになります。詳細は「Cookieシミュレート機能」の項を参照ください。

  19. ChxjCookieMemcacheHost

    memcachedの動作するホストを指定します。

    ChxjCookieMemcacheHostの例
             ChxjCookieMemcacheHost "localhost"
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

  20. ChxjCookieMemcachePort

    memcachedのポート番号を指定します。

    ChxjCookieMemcachePortの例
             ChxjCookieMemcachePort 11211
          
    

    詳細は「Cookieシミュレート機能」の項を参照ください。

対応するCHTMLタグ

変換可能なCHTMLタグは以下のとおりです。

対応タグ一覧
タグ 属性 備考
<!-- --> 無視します。
<A>
name HDMLでは無視します
href
accesskey
<BASE> HDMLでは無視します
href HDMLでは無視します
<BODY> HDMLでは無視します
bgcolor HDML,CHTML1.0では無視します
text HDML,CHTML1.0では無視します
link HDML,CHTML1.0では無視します
alink HDML,XHTML,CHTML1.0,CHTML2.0,CHTML3.0,JHTML,JXHTMLでは無視します。0.12.0以降で対応
vlink HDML,XHTML,CHTML1.0,CHTML2.0,CHTML3.0,JHTML,JXHTMLでは無視します。0.12.0以降で対応
<BLINK> HDML,CHTML1.0では無視します。0.11.0以降で対応
<BLOCKQUOTE> 0.11.0以降で対応
<BR>
clear HDMLでは無視します。0.11.0以降で対応
<CENTER>
<DIR> 0.11.0以降で対応
type HDML,CHTML1.0,CHTML2.0,CHTML3.0,JHTMLでは無視します。0.12.0以降で対応
<DL> HDMLでは無視します。0.11.0以降で対応
<DT> 0.11.0以降で対応。必ずタグは閉じてください
<DD> 0.11.0以降で対応。必ずタグは閉じてください
<DIV>
align
<FONT> HDML,CHTML1.0では無視します
color HDML,CHTML1.0では無視します
size 0.12.0以降で対応。HDML,CHTML1.0,CHTML2.0,CHTML3.0,CHTML4.0では無視します。
<FORM>
action
method HDMLでは無視します
<Hn> HDML,JHTMLではalignのみ有効。0.11.0以降で対応
align HDML,JHTMLではalignのみ有効。0.11.0以降で対応
<HR>
align HDMLでは無視します。
size HDMLでは無視します。
width HDMLでは無視します。
color HDML,CHTML1.0,CHTML2.0,CHTML3.0では無視します。0.12.0以降で対応
<HTML> 属性を指定した場合は無視されます
<IMG>
src
align
width
height
hspace JHTMLでは無視します。
vspace JHTMLでは無視します。
alt
<INPUT>
name
type text,password,hidden,radio,checkbox,submit,resetに対応
value
istyle
size HDMLでは無視します。
maxlength
checked HDMLでは非対応。
accesskey
<LI>
type 0.11.0以降で対応。HDML,CHTML1.0では無視します。
value 0.11.0以降で対応。HDML,CHTML1.0では無視します。
<MENU> 0.11.0以降で対応。HDMLでは無視します。
type HDML,CHTML1.0,CHTML2.0,CHTML3.0,JHTMLでは無視します。0.12.0以降で対応
<MARQUEE> 0.11.0以降で対応。HDML,CHTML1.0,XHTMLでは無視します。
direction 0.11.0以降で対応。HDML,CHTML1.0,XHTMLでは無視します。
behavior 0.11.0以降で対応。HDML,CHTML1.0,XHTMLでは無視します。
loop 0.11.0以降で対応。HDML,CHTML1.0,XHTML,JHTMLでは無視します。
bgcolor 0.12.0以降で対応。HDML,CHTML1.0,CHTML2.0,CHTML3.0,CHTML4.0,JHTMLでは無視します。
<OL> 0.11.0以降で対応。HDMLでは無視します。
type 0.11.0以降で対応。HDML,CHTML1.0では無視します。
start 0.11.0以降で対応。HDML,CHTML1.0では無視します。
<SELECT>
name
size HDMLでは無視します
multiple HDML,CHTML1.0では無視します。0.11.0以降で対応
<OPTION> 必ずタグは閉じてください
value
selected HDMLでは無視します
<P> HDMLではalignのみ有効。
align 0.11.0以降で対応
<PLAINTEXT> 0.11.0以降で対応
<PRE> HDMLは0.11.0以降で対応
<TEXTAREA>
name
rows
cols
accesskey 0.11.0以降で対応
istyle 0.11.0以降で対応
<META>
http-equiv CHTML1.0,HDMLでは無視されます
content CHTML1.0,HDMLでは無視されます
<HEAD> 属性を指定した場合は無視されます
<TITLE> 属性を指定した場合は無視されます
<UL> 0.11.0以降で対応
type HDML,CHTML1.0,CHTML2.0,CHTML3.0,JHTMLでは無視します。0.12.0以降で対応
<CHXJ:IF> lang lang属性には"chtml","xhtml","hdml","jhtml","jxhtml"が指定できます。(jxhtmlは0.12.0以降で対応)

上記以外のタグは全て無視します。

独自拡張タグ

  1. <CHXJ:IF>

    <CHXJ:IF>タグと</CHXJ:IF>タグではさまれたタグやテキストは、変換せずにそのまま(5)出力します。必須の属性としてlangがあります。lang属性を指定することによって、例えば、「HDML機の場合のみ出力させる」といったことを可能にします。



    ex)

    HTML文書中にHDML機の場合のみ有効にしたいタグ、または文書がある場合
           <CHXJ:IF lang="HDML" >
             <NODISPLAY>
    <ACTION TYPE=ACCEPT TASK=GOSUB \
        DEST='device:data/dnld?url=abc&name=abc.jpg&size=100&disposition=devjaww&title=test'> \
             </NODISPLAY>
           </CHXJ:IF>
           
    



    ex)

    i-Modeのみ出力したい文書がある場合
           <CHXJ:IF lang="chtml" >
             シークレットコードがどーのこーの。
           </CHXJ:IF>
           
    



    また、lang属性は、複数指定することも可能です。

    HDML機,J-PHONE機は以下を出力します
           <CHXJ:IF lang="chtml" lang="jhtml">
           あなたの携帯は、HDML機かJ-HTML機です。
           </CHXJ:IF>
           
    



  1. 変換しませんので注意が必要です

絵文字について

i-Mode用の絵文字を書いておけば、アクセスしたキャリアによって、mod_chxjが対応の絵文字に自動変換します。ソースに2byteのバイナリコードを直接書いても、10進参照文字列(6)(&#XXX;の形)で書いても、どちらでも変換対象になります。10進参照文字列で書いた場合は、mod_chxjにより、自動で2バイトコードに変換します。

  1. 16進参照文字列には対応していません

絵文字変換定義

絵文字の変換に関する動作を変えたい場合(例えば「ハートがあったら、auの場合はスペードに」とか、「変換定義がおかしい」といった場合)は、emoji.xmlファイルを直接編集することによって定義を変更することが可能です。emoji.xmlはXMLファイルとなっていますので、vi等で簡単に定義を変更することができます。



以下に、emoji.xmlファイルの一部を記します。

emoji.xml
<?xml encoding="Shift_JIS" >

<emoji>
  <set>
    <no>1</no>
    <imode>
      <hex1>f8</hex1>
      <hex2>9f</hex2>
      <string>&#63647;</string>
      <description></description>
    </imode>
    <ezweb>
      <A>44</A>
      <B>44</B>
      <C>44</C>
      <D>44</D>
    </ezweb>
    <jphone>
      <string>$Gj</string>
    </jphone>
  </set>

絵文字の定義は、<emoji>タグから</emoji>タグまでの間にあります。その中の要素を説明します。1つの絵文字につき、1つのセット(<set>タグから</set>タグまで)とし、キャリア毎の絵文字を定義しています。

  1. <imode>要素

    まず、元となるi-Mode用の絵文字は、<imode>タグにはさまれた間に定義されています。<imode>要素は、2バイトコード要素(<hex1><hex2>)と、10進参照文字列要素(<string>)を保持していて、この2つの要素を変換元の値として使用します。アクセスしてきた端末が、i-Mode機であった場合で、かつCHTML中に10進参照文字列が絵文字として書かれている場合には、<hex1><hex2>要素に定義されている値に置換します。



  2. <ezweb>要素

    アクセスしてきた端末が、au機であった場合、<ezweb>要素に定義されている値に変換します。<ezweb>要素は、<A>〜<D>要素を持っていて、それぞれauの絵文字タイプA〜Dに対応していますので、もし、Dタイプの絵文字端末であったなら、<D>要素に定義されている値に変換します。ここで定義されている値は、HDML機の場合は、<IMG ICON="XX">の"XX"の部分に当てはめられて、置換されます。XHTML機の場合は、<IMG LOCALSRC="XX">の"XX"の部分に当てはめられて、置換されます。



  3. <jphone>要素

    アクセスしてきた端末が、SoftBank/Vodafone/J-Phone端末であった場合、<jphone>要素に定義されている値に変換します。<jphone>要素は、<string>要素を保持していて、ここで定義されている値を直接使用します。



emoji.xmlに定義されていない絵文字で、変換したい絵文字がある場合には、このファイルに新たな定義を足せば、変換するようになります。

デバイス定義 device_data.xml

mod_chxjの動作を決定付ける重要な定義です。変換対象の端末は全て、device_data.xmlファイルに定義される必要があります。定義されていない端末は、mod_chxjとしては、認識することができません。認識できない場合には、変換せずにそのまま出力します。ただし、Perl互換の正規表現によって定義できるため、正規表現の書き方によっては全ての機種に対応させることも可能です。

イメージ画像変換機能

mod_chxjには、JPEG、GIF、PNG、BMPファイルを置いておくだけで、デバイス定義に従って、それぞれのキャリア対応のフォーマットに変換する機能があります。画像のサイズ(縦X横)も、端末の画面サイズに合わせて変換します。画像のサイズ(バイト数)については、デバイス定義中のキャッシュサイズを見て、その値よりも小さくなるように努力しますが、元の画像が大きすぎる場合や、複雑な画像の場合には、キャッシュサイズよりも小さくできずに表示できない場合があります。

それぞれのタグで指定する場合には、ファイル名の拡張子(.jpgや.gif等)をはずした形で指定します。

本機能には3つのモードが存在します。そのモードを以下に記します。

サムネイルモード

端末側画面サイズの約3分の1程度のサイズ(縦X横)に画像を縮小表示します。

サムネイルモード 使用例
  <IMG SRC="/img/logo?Mode=Thumbnail">
  

壁紙モード

端末側画面のサイズにマッチするサイズに拡大・縮小します。横長の画像の場合には、縦幅を合わせた後に左右をトリミングします。

壁紙モード 使用例
  <IMG SRC="/img/logo?Mode=WP">
  

EzGetモード

壁紙ダウンロードを行いたい場合に使用します。EzGETモードは、壁紙モードで出力される画像サイズと同一サイズの画像が使用されます。

EzGetモード 使用例
  <A HREF="/img/logo?Mode=EzGet">
  

その他の機能

モードの他に、画像サイズ(縦X横)を直接指定することも可能です。wパラメータ、hパラメータを使用して指定します。

  1. wパラメータ

    横幅を指定します。
  2. hパラメータ

    縦幅を指定します。
    w/hパラメータ 使用例
      <IMG SRC="/img/logo?w=100&h=200">
      
    
  3. User-Agentパラメータ(uaパラメータ)

    User-Agentを指定します。指定した場合は、リクエストヘッダ中のUser-Agentを本パラメータの値で上書きします。このパラメータに"IGN"を指定した場合は、User-Agentを無視します。Thumbnailモード、壁紙モードと併用時は、640x480を元に画像サイズを算出します。

上記全てのモード、パラメータはGETリクエストとしてのみ使用できます。

QRコード出力機能

QRコード出力ハンドラの登録

QRコード出力機能を使用するには、QRコードハンドラを登録します。(7)httpd.confに以下の記述を追加します。

httpd.conf
  AddHandler chxj-qrcode .qrc

なお、ハンドラを登録しないでも、出力フィルターを経由させることで、QRコードを出力させることも可能です。(※QRコードの動的出力を参照)

  1. QRコードは(株)デンソーウェーブの登録商標です。

QRコードソースファイルの設置

ハンドラを登録したら、その登録した拡張子を持つファイルを用意します。

例:a.qrc
  <?xml version=1.0 ?>
  
  <qrcode>
    <version>13</version>
    <level>H</level>
    <mode>8bit</mode>
    <size>1</size>
    <data>テストデータです</data>
  </qrcode>

.qrcファイルは、qrcode要素、version要素、level要素、mode要素、size要素、data要素から成り立ちます。

  1. versionタグversionタグは出力するQRコードの生成に利用するバージョンを指定します。使用できるバージョンは、1〜40までの40種類です。
  2. levelタグlevelタグは出力するQRコードの生成に利用する誤り検出レベルを指定します。 使用できるレベルは、L、Q、M、Hの4つです。
  3. modeタグmodeタグは出力するQRコードの生成に利用するモードを指定します。使用できるモードは、NUM(数字モード)ALPHA(英数字モード)8BIT(8ビットバイトモード)KANJI(漢字モード)です。
  4. sizeタグsizeタグは1モジュールを何ピクセルであらわすかを指定します。0を指定した場合は、4を指定した場合と同じ動作をします。 使用できるサイズは、0〜20までです。
  5. dataタグdataタグは、QRコードに出力するデータを指定します。改行した場合は、改行文字もQRコード内に符号化されます。

QRコードの動的出力機能

プログラム等を使用し、動的にQRコードを出力したい場合は、上記の.qrcファイルの内容をそのままOutputFilterに通してあげればOKです。つまり、ChxjConvertRuleディレクティブで"EngineOn"と指定したURIが指すディレクトリに設置すれば良いということです。mod_chxj内部で、Content-Typeがtext/xmlの場合、QRCode用のファイルであるかどうかを一度読み込んで判断するので、Content-Typeには、text/xmlを設定してください。

phpでQRコードを動的に出力する例
    <php
      $version = $_POST["version"];
      $level   = $_POST["level"];
      $mode    = $_POST["mode"];
      $size    = $_POST["size"];
      $data    = $_POST["data"];

      header("Content-Type: text/xml; charset=Shift_JIS");

      echo "<qrcode>\n";
      echo "<version>".$version."</version>\n";
      echo "<level>".$level."</level>\n";
      echo "<mode>".$mode."</mode>\n";
      echo "<size>".$size."</size>\n";
      echo "<data>".$data."</data>\n";
      echo "</qrcode>\n";
    >
  

そして、上記のコードを、mod_chxj変換エンジンが処理するはずであるところに設置すれば完了です。

Cookieシミュレート機能

Cookieシミュレート機能

Cookieを受け付けない(無視する)端末のためにCookieをシミュレートします。本機能を有効にするためにはChxjConvertRuleディレクティブを使用する必要があります。ChxjConvertRuleディレクティブの第2パラメータにCookieOnを指定します。

Cookieシミュレート機能を有効にする例
    ChxjConvertRule "^/chxj.+$" "EngineOn,CookieOn" "NONE"
  

One-Time ID

Cookieシミュレートでは、aタグ、imgタグ、formタグのURL部にOne-Time IDを埋め込むことで実現します。そのため、ユーザがブラウザの戻るボタン等で戻った場合はCookieを取得できなくなります。One-Time IDを使用する必要が無い場合、またはOne-Time IDを使用したくない場合には、CookieLazyModeを使用することで毎回同一IDを発行させることができます。

Cookieの保存場所

Cookieの内容はサーバ側に保存されます。保存先にはdbm、memcached、mysqlが選択できます。

注意) memcached、mysqlを保存先に選択する場合はconfigure時にそれぞれ指定する必要があります

保存先の指定にはChxjCookieStoreTypeディレクティブを使用します。

ChxjCookieStoreTypeでDBMを指定した例
    ChxjCookieStoreType "dbm"
  
ChxjCookieStoreTypeでMySQLを指定した例
    ChxjCookieStoreType "mysql"
  
ChxjCookieStoreTypeでmemcacheを指定した例
    ChxjCookieStoreType "memcache"
  

上記ChxjCookieStoreTypeが指定されない場合はdbmが選択されます。

dbmを使用する場合は、ChxjCookieDirディレクティブを指定し、保存ディレクトリを指定します。指定しなかった場合は/tmpに保存されます。

ChxjCookieDirの例
    ChxjCookieDir /var/abc
  

DBMの代わりにMySQLやmemcachedを指定することもできます。その際は、ChxjCookieDirは指定する必要はありません。MySQLを使用するには、configure時にMySQL COOKIE機能を有効にして、コンパイルする必要があります。(8)memcachedを使用するには、configure時にMEMCACHE COOKIE機能を有効にして、コンパイルする必要があります。(9)

MySQLを使用する場合にはChxjCookieStoreTypeディレクティブのほかに、以下のディレクティブを指定する必要もあります。

  1. ChxjCookieMysqlHost

    MySQLサーバの動作するホストを指定します。
    ChxjCookieMysqlHostの例
             ChxjCookieMysqlHost "localhost"
          
    
  2. ChxjCookieMysqlPort

    MySQLサーバのポート番号を指定します。
    ChxjCookieMysqlPortの例
             ChxjCookieMysqlPort 3306
          
    
  3. ChxjCookieMysqlDatabase

    MySQLサーバのデータベース名を指定します。
    ChxjCookieMysqlDatabaseの例
             ChxjCookieMysqlDatabase "test_db"
          
    
  4. ChxjCookieMysqlUsername

    MySQLサーバに接続する際に使用するユーザ名を指定します。
    ChxjCookieMysqlUsernameの例
             ChxjCookieMysqlUsername "roottest"
          
    
  5. ChxjCookieMysqlPassword

    MySQLサーバに接続する際に使用するパスワードを指定します。
    ChxjCookieMysqlPasswordの例
             ChxjCookieMysqlPassword "pwtest"
          
    
  6. ChxjCookieMysqlSocketPath

    MySQLのソケットパスを指定します。
    ChxjCookieMysqlSocketPathの例
             ChxjCookieMysqlSocketPath  "/tmp/mysql.sock"
          
    
  7. ChxjCookieMysqlCharset

    MySQLのエンコードを指定します。
    ChxjCookieMysqlCharsetの例
             ChxjCookieMysqlCharset  "utf8"
          
    
  8. ChxjCookieMysqlTablename

    MySQLのクッキーを保存するテーブル名を指定します。

    ChxjCookieMysqlTablenameの例
             ChxjCookieMysqlTablename  "chxj_cookie"
          
    

    上記のように"chxj_cookie"と指定すると、実際に作成されるテーブルは、chxj_cookieとchxj_cookie_expireテーブルの2つになります。

memcachedを使用する場合にはChxjCookieStoreTypeディレクティブの他に以下のディレクティブを指定する必要もあります。

  1. ChxjCookieMemcacheHost

    memcachedの動作するホストを指定します。
    ChxjCookieMemcacheHostの例
             ChxjCookieMemcacheHost "localhost"
          
    
  2. ChxjCookieMemcachePort

    memcachedのポート番号を指定します。
    ChxjCookieMemcachePortの例
             ChxjCookieMemcachePort 11211
          
    
  1. Buildの項参照
  2. Buildの項参照

Cookieの保持期間

ChxjCookieTimeoutディレクティブで保持期間を指定することができます。指定しなかった場合は1800秒でサーバに保存されているCookieは削除されます。

ChxjCookieTimeoutの例
    <Location />
      ChxjCookieTimeout 10
    </Location>
  

上記の例は、10秒でタイムアウト(サーバから削除)するように指定しています。

CookieLazyMode

ChxjCookieLazyModeディレクティブで"true"を指定するとOne-Time IDを使用しないようにすることができます。Cookie用のIDは毎回同一のIDが割り振られます。以下にCookieLazyModeの例を記します。

ChxjCookieLazyModeの例
  ChxjCookieLazyMode true

true以外を指定すると通常のOne-Time IDモードになります。

Refererシミュレート機能

Refererシミュレート機能

DoCoMo端末などのRefererに対応していない機種のためにRefererシミュレート機能を提供します。本機能は、Cookieシミュレート機能を有効にすると、自動で有効になります。