Apache に静的 Web ページをオンザフライで変更させる
質問
私は実験してきました ウープラ.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