● トラブルシューティング・よくある質問

1.文字化けします。
まず、お客様のPHPの設定をご確認ください。サーバサイドSHTML(体験版を含む)は、UTF-8版とEUC-JP版、Shift_JIS版の3つがあり、別々のプログラムになります。お客様のPHPの内部エンコーディングと同一のサーバサイドSHTMLをご利用いただけていますでしょうか?

また、内部エンコーディングと異なる文字コードにmb_convert_encoding()関数などを用いて変換した後に、弊社提供の難読化関数getEncryption_shtml関数の引数として渡されていませんか? EUC-JP版のサーバサイドSHTMLは、難読化対象の文字列がEUC-JPであるという前提で設計されています。同様に、UTF-8版のサーバサイドSHTMLは、UTF-8でエンコードされた文字列を難読化するという前提で設計されています(こちらの関連質問もご参照ください。)。

次に、サーバサイドSHTMLで難読化した場合、HTMLソースのそのほとんどが英数字になります。そのため、ブラウザがShift_JISのサイトであると誤認する可能性が相対的に高くなります。そこで、メタタグを必ず指定してください

また、そうできない特別な理由がない限り、PHPファイルの中で、header関数で文字コードを指定するようにしてください。
header("Content-type: text/html; charset=UTF-8");

のような感じです。

2. 特定のページで、レイアウトが崩れます。
いくつかの条件が重なると、レイアウトが崩れることがあります。それは仕様ですが、解決方法はあります。

まず、レイアウトが崩れるケースの条件ですが、
  • プロテクトコード(どこでもSHTMLで作成した右クリック禁止などのJavaScript)以外のJSファイルを使っている場合で、
  • かつ、JSファイル内で「document.writeメソッドを使っている場合で、
  • かつ、そのdocument.writeメソッドが実行されるタイミングがページ本体のロード完了前である場合です。(ボタンをクリックしてサブウインドウが開く場合などにdocument.writeメソッドを使用している場合は関係がありません。)
この場合、JSファイル内でdocument.writeされているソースは、元々のレイアウトにかかわらず、ページの最下部に表示されます(Internet Explorerの場合。Firefoxでは問題ありません)。

対策は、
getEncryption_shtml関数を呼び出すのを複数回に分けていただくことです。問題のJSファイルを含むソースを境界にしてソースを分割して難読化させるようにします。例を挙げて説明しますと、 shtml_logo.jsというJSファイル内にて、Flashファイル表示用のHTMLソース(objectタグやembedタグ)をdocument.writeしている場合を考えてみます。

体験版及び製品版のfaqフォルダー内のサブフォルダー=logo内のshtml_logo_layout.phpをご覧ください。


shtml_logo.jsのソース:


この場合、本来は、「あいうえお→SHTMLのロゴ(flash)→かきくけこ」と表示されてほしいのに、Internet Explorerの場合には、「あいうえお→かきくけこ→SHTMLのロゴ(flash)」と表示されてしまいます。改善方法を下記に示します。



このように、ソースを分割していただければ、「あいうえお→SHTMLのロゴ(flash)→かきくけこ」と期待通りに表示されるようになります。

(問題を起こすソース部分=$contents2の部分が例えば、Google AdSenseのような、他社のスクリプトである場合には、これを難読化しなければならない理由は多くの場合ないでしょうし、むしろするべきでない場合も多いでしょうから、単にこの部分は平分のままprintしていただくようにしても、レイアウト崩れの問題は解決します。)

なお、JSファイル内でdocument.writeするのではなく、HTML本体内でdocument.writeしている場合には、レイアウトの崩れは、この対策をしていない場合でも生じません

 もっとも、外部ファイル(JSファイル)を使用せずに、Flash表示用のHTMLタグをHTML本体内のソース内に書いた場合、Flashのアクティブ化対策の問題(「クリックするとこのコントロールをアクティブにして使用します」というメッセージが表示される)がありますが、このアクティブ化対策の方法を変更することで可能です。若干の注意事項はありますが、弊社でその対策用のコードの書き方を教授させていただくことは可能です。サポートにお問い合わせください。

また、別の対策もあります。JSファイル内でdocument.writeメソッドを使用せずにinnerHTMLを使用するようにします。上記の例で言えば、

のように書き換えます。(体験版及び製品版のfaqフォルダーの中のlogoフォルダー内にありますshtml_logo_inner_crypted_b.phpが該当します。)

もう一例、改善策をご紹介します。JSファイルの中で直接document.writeするのではなく、JSファイル内では、あくまでもdocument.write用の関数のみを定義し、その関数を呼び出すのはHTML本体内から行うようにします。(体験版及び製品版のfaqフォルダーの中のlogoフォルダー内にありますshtml_logo_header_crypted.phpが該当します。)



shtml_logo3.jsの中身は下記のようになります。


なお、外部ファイルを書き換える際にshtml_logo4.jsのように書き換え、shtml_logo_fail.phpのようにしてしまうと失敗します。flashWrite関数の呼び出しは必ず、JSファイル内からではなくHTML本体からやらなければ意味がありません。


3. 空白ページが表示されます。
空白ページが表示される場合、いくつかの可能性が考えられます。まず、空白のページでHTMLソースを表示させてみてください。その時、
  • 「<HTML>></HTML>」の場合

  • 「<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><META http-equiv=Content-Type content="text/html; charset=shift_jis"></HEAD><BODY></BODY></HTML>」の場合

  • 「サーバサイドSHTMLで難読化したソース(JavaScript)もしっかりと表示されている場合」とで、原因は異なります。

  • 難読化したソースを外部ファイル化(JSファイル化)している設定にしている場合

「<HTML>></HTML>」の場合、「どこでもSHTML」で作成したプロテクトコードが不適切なために、想定外の時にプロテクトコードが働き、真っ白のページ(about:blank)が表示されているものと思われます。ですから、どこでもSHTMLでJSファイルを作成しなおす必要があります。

「<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 〜」の場合ですが、ブラウザが出力する文字列が存在しないときに、Windows版Internet Explorerが勝手に作成しているソースです。即ち、原因はprintする際に、print対象の変数名(難読化された文字列が入っている変数の名称)を書き間違えているか何かで、空の文字列をprintしていることが原因であると思われます。

また、第3の「サーバサイドSHTMLで難読化したソース(JavaScript)もしっかりと表示されている場合」の場合ですが、
  • getEncryption_shtml関数に引き渡す難読化対象の文字列が入った変数名の名称を間違っていないかどうかご確認ください。この変数名を間違っておられた場合、空の文字列を難読化することになりますますから、やはり、何も表示されません。

  • 難読化を行うと、HTMLソースのほとんどが英数字だけになります。そのため、ブラウザによっては、文字コードの自動判別に失敗することがあります。この場合に、何も表示されないように見える場合があります。実際には、サイト訪問者がエンコードを手動で修正すれば表示されます。ただし、もちろん、これは不恰好ですから、必ず、プログラム側にて、「下記のようにheader関数で適切なcharsetを出力する」、「メタタグによるcharsetの指定」(<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">など)が不可欠です。

    header("Content-type: text/html; charset=UTF-8");
    のようなheader関数による出力文字コードの指定を行うようにしてください。
最後に、難読化したソースを外部ファイル化(JSファイル化)している設定にしている場合ですが、JSファイルを生成することになっているディレクトリーに書きこみ権限が設定されているかどうかをご確認ください。PHPをCGI版として使われており、suexecを利用していない場合には、nobodyもしくはwebuserに書き込み権限がなければ動作しません。

4. md5エラーが表示されます。
体験版及び製品版内のma_shtml.phpというファイルは触らないようにしてください。ライセンス管理上、MD5でハッシュ値を生成させ、チェックしています。改行コードはCRLFもしくはLFのどちらでもOKなようにはしてあります(お客様サーバがMacサーバである場合には、改行コードCRでも動作するようにもちろんします)が、MD5の特性上、改行が一つ増えたりするだけでもハッシュ値が変わり、動作しなくなる原因になります。

5. 「domin error」というアラートが表示されます。
サーバサイドSHTML(体験版/製品版とも)は、ご登録していただいたサーバでのみ動作するようにしてあります。サーバ名の名称を「$server_name_shtml=getenv("SERVER_NAME");」でチェックさせていただいています。

サブドメインの違いは問いませんので、http://www.example.com でご登録いただいた場合には、test.example.comやlocalhost.example.comなどをテストサーバ名として運用していただければと存じます。つまり、お手数ですが、テストサーバで動作させる場合には、テストサーバのサーバ名を一時的にでも、hostsファイルやhttpd-vhosts.confを調整することで、ご登録のサーバ名(ドメイン名)と一致化させるようにしてください。

テストサーバの名称をどうしても調整できない場合には、サポートにお問い合わせください。


HTMLソース難読化用PHPライブラリ
「サーバサイドSHTML for PHP」
© 株式会社プランセスお問い合わせ