web-dev-qa-db-ja.com

配信されたすべてのHTMLページにHTMLコードを挿入する方法は?

静的HTMLページを配信するApache web serverがあります。何らかの理由でファイル自体を変更することはできませんが、それでも、配信されるすべてのページにHTMLを挿入したいのです。

これはmod_proxyで可能ですか?そうでない場合、誰かがそのような機能を提供するソフトウェアを推奨できますか?

編集:ある種のバナー広告(javascriptなど)と追跡ピクセルを挿入する必要があります。

23
Node

あなたはこれを行うことができます:mod_rewriteを操作してからリクエストを変更します

/some/static/page.html

/htmlinjector.php?url=/some/static/page.html

次に、PHP(または適切と思われるもの)を使用してファイル操作を行います。パフォーマンスを向上させるために出力キャッシュを追加します。

別の方法として、 Apache Handlers が役立ちます:

CGIスクリプトを使用して静的コンテンツを変更する

次のディレクティブを使用すると、html拡張子が付いたファイルのリクエストにより、footer.pl CGIスクリプトの起動がトリガーされます。

Action add-footer /cgi-bin/footer.pl
AddHandler add-footer .html

次に、CGIスクリプトは、最初に要求されたドキュメント(PATH_TRANSLATED環境変数によって示される)を送信し、必要な変更または追加を行います。

これは多かれ少なかれmod_rewriteアプローチが行うことであり、ハッカーが少ないだけです。

18
Tomalak

なぜこれが回答のリストに記載されていないのか分かりません。この質問を見るのに2年かかった場合は申し訳ありません...

やりたいことをやりやすくする最も簡単で強力な方法は、 Apacheフィルター を使用することです。

ただ持っている:

ExtFilterDefine css_changer mode=output intype=text/html cmd="/some/php/script.php"
SetOutputFilter css_changer

可能なスクリプト:

#!/usr/bin/php
<?

#phpinfo(); // Uncomment to see ALL env variables
$Host = $_ENV["HTTP_Host"]; // www.site.com
$script_name = $_ENV["SCRIPT_NAME"]; // /theme/green/style.css
$pi = pathinfo($script_name);
$type = $pi['extension'];
#print "$Host $script  $type";

$stdin = STDIN;

while($line = fgets($stdin)){
  $line = preg_replace('/a/', 'A', $line);

  fwrite(STDOUT, $line);
}
fclose(STDOUT);
?>

これにより、すべての "a"が "A"に変更されます。

次のように、httpd.confでフィルタを必ず有効にしてください。

LoadModule ext_filter_module libexec/Apache2/mod_ext_filter.so

この質問はGoogleで上位にランクされており、フォーラムに関してはそれほど多くありません。

20
Merc

私はmod_rewriteとSSIでこれを行うことを好みます。

最初にパスを環境変数に入れます

 RewriteCond%{IS_SUBREQ} false 
 RewriteRule ^(/.* \。html)/page.shtml [E:filename:$ 1] 

それをshtmlファイルで処理します

 <!-#include virtual = "$ filename"-> 

(このソリューションの一部は、stackoverflowの質問に基づいています https://stackoverflow.com/questions/40133/getting-Apache-to-modify-static-webpages-on-the-fly/1196832

4
Alex Lehmann

これはチュートリアルです Webページ上のリンク(コンテンツ)を編集するための mod_proxy_html の使用方法。これを適用して、必要なHTMLを変更できる場合があります。

更新:このルートに移動してもよろしいですか? Apacheはコンテンツを提供するためのものであり、作成するためのものではないと思います。これはおそらくMVCフレームワークのビュー部分に入るでしょう。私がこれをお勧めしない理由は、あなたが モジュール性の規則 を破っているからです。 Webアプリケーションは、それを処理するアプリケーションと絡み合い、将来のアップグレード、移動などを複雑にします。

4
Kyle Brandt

mod_sed が適しています。たとえば、終了ヘッドまたは本文タグに一致する出力フィルターを作成し、その前にHTMLを挿入できます。

4
cwarden

Mod_Perlモジュールはどんな用途ですか?

http://search.cpan.org/~gozer/Apache2-Layout-0.6/lib/Apache2/Layout.pm

それはあなたが望むことをするかもしれません、または少なくとも、あなたを正しい方向に向けます。

1
CK.

以下のディレクティブを使用して、Apacheのヘッダーおよびフッターディレクティブを調べることができます。

<Directory "/usr/local/www/data/scott">
    Options +Indexes
    AllowOverride All
    AddOutputFilter LAYOUT html htm shtml
    LayoutComment On
    LayoutHeader /wrappers/scott-header.html
    LayoutFooter /wrappers/scott-footer.html
</Directory>

詳細はこちら: http://wannabe.guru.org/scott/hobbies/Apache/

1
Roy Rico

Apache mod_substituteを使用して、いくつかの基準または正規表現を使用して、htmlを発信応答に挿入できます。 ここ はこれを実現する方法の説明です。

1
Kayvan

Mod Layoutは廃止されました。外部スクリプトを呼び出すオーバーヘッドが不要な場合、私にとって有効な最善の解決策は mod sed でした。 mod sedを使用してdocの最初の行(1s)を照合し、そこにヘッダースクリプトコードを追加して、最後の行($ s)を照合し、そこにフッターを配置できます。

Options Indexes FollowSymLinks Includes ExecCGI
Order Deny,Allow
Deny from none
Allow from all
Require all granted

AddOutputFilter Sed html
SetOutputFilter Sed;DEFLATE
OutputSed "1s|^|<header code>|"
OutputSed "$s|$|</footer code>|g"
1
MohitC

apacheを介してすべてのページにHTMLを挿入できますが、Apacheプロキシサーバーを介してすべてのサイトではなく、Apacheによってホストされているサイトに対してのみです。

これがどのように機能するかです。 XAMPPをセットアップし、Apache 2.4用のmod_layout 5.1をダウンロードします。 (mod_layoutのインストールは簡単です。WindowsでXAMPPを使用している場合は、Windowsでmod_layout.so 5.1をダウンロードしてApacheモジュールフォルダー$ home/Apache/moduleに配置し、構成DSOをhttpd.conf LoadModule layout_module modules /に追加します。 mod_layout.so-Linuxまたはその他のOSを使用している場合は、Linux用のmod_layout.soをダウンロードしてから、makeコマンドを実行してインストールする必要があります)

Windows用のmod_layout.soをインストールした後、このコードを.htaccessファイルまたはhttpd.confに配置するだけで、すべてのページにHTML挿入が行われます。

<IfModule mod_layout.c>
AddOutputFilter LAYOUT html 
AddOutputFilter LAYOUT htm 
AddOutputFilter LAYOUT shtml 
AddOutputFilter LAYOUT shtm 
AddOutputFilter LAYOUT cgi 
AddOutputFilter LAYOUT php 
LayoutFooter "C:/xampp/Apache/cgi-bin/footer.php"
</IfModule>

C:/xampp/Apache/cgi-bin/footer.phpは、htmlまたはphpファイルを配置する場所です。私の状況では、C:/xampp/Apache/cgi-bin/footer.phpですが、どこに配置してもかまいません。 、ちょうど正しい道を与えてください、あなたは大丈夫です

0
Leon Kaden