質問

私は実験してきました ウープラ.com ウェブ解析ツール。これを機能させるには、各ページに JavaScript コードを追加する必要があります。これは、ユニバーサル ヘッダーまたはフッターを備えた動的なサイトでは十分に簡単ですが、完全に静的な HTML ページの場合はそうではありません。

私は、Apache の書き換えと SSI を組み合わせて、必要なコードで静的 HTML を「ラップ」することで、この問題を回避しようとしました。例えば...

Apache 構成に次の変更を加えました

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !=test.shtml
    RewriteCond %{IS_SUBREQ}  false 
    RewriteRule (.*)\.html test.shtml?$1.html

test.shtml ファイルには次の内容が含まれています...

    <script type="text/javascript">
       var XXXXid = 'xxxxxxx';
    </script>
    <script src="http://xxxx.woopra.com/xx/xxx.js"></script>

    <!--#set var="page" value="$QUERY_STRING" -->
    <!--#include virtual= $page -->

アイデアは、次のようなリクエストが来るということでした。

    /abc.html

にリダイレクトされます

    /test.shtml?abc.html

shtml は元のファイルを応答ページに含めます。

残念ながら、それは計画どおりに完全には機能しません:) 誰かが私が間違っていることを見つけたり、おそらく代替アプローチを提案したりできませんか。同じことを実行できるApacheモジュールはありますか。できれば、サイトごとに設定できることが望ましいです。

ありがとう

ピーター

役に立ちましたか?

解決

私はそう思います mod_filter_ext 探しているモジュールです。たとえば、ページに JS コードを挿入し、それを登録して HTML ページを処理するための短い Perl スクリプトを作成できます。

while (<>) {
    s/<html>/\Q<script>....\E/;
    print $_;
}

次のようなものを使用することもできます sed 置換を実行します。

他のヒント

ページが静的である場合、サイト上のすべてのページを前処理して各ページに必要な JavaScript を追加するのではなく、その場でページを変更するのはなぜでしょうか。これはシンプルで、おそらくより効率的です (変更するページよりも多くのページビューがある可能性があります)

これはさまざまな方法で実行できます。インライン置換に小さな Perl を使用することをお勧めします。

上記の方法の最大の問題は、script タグを外部に配置することで HTML の有効性が損なわれてしまうことです。 <html> タグ

sed/awk スクリプトなどの HTML ファイルに対して前処理を実行するという点については、他の意見に同意します。

これは簡単な例です {スクリプト部分をスクリプトの前に追加できると仮定します </head>そしてそれは </head> は改行の先頭にあります

#!/bin/bash

cd /var/webserver/whatever/

grep -r '<\/head>' */*|grep "^.*\.html*:" >/var/tmp/tempfile.txt
((lines = $(wc -l /var/tmp/dom-tempfile.txt | awk '{print $1}')))
if [ $lines -gt 0 ]
then
 while read line; do
 sed 's/<script type="text\/javascript"> var XXXXid = "xxxxxxx"; <\/script><script src="http:\/\/xxxx\.woopra\.com\/xx\/xxx\.js"><\/script><\/head>/^<\/head>/g' $line>/var/tmp/tempfile.htm
 mv /var/tmp/tempfile.htm $line
 done < <(sed 's/\(^.*\.html*\):.*$/\1/' /var/tmp/tempfile.txt)
fi
exit 0

構文エラーがある可能性がありますので、 $page は引用符で囲まれていませんが、そうならない主な理由は次の 2 つです。

  • / で始まるパスに virtual を含める必要があります。この例では、クエリ文字列は abc.html ではなく /abc.html である必要があります。
  • 書き換えルールもパスで始まる必要があるため、書き換えルールは次のようにする必要があります。

    RewriteRule ^(.*)\.html /test.shtml?$1.html
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top