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


23

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

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

編集:バナー広告(javascript)などの種類とトラッキングピクセルを挿入する必要があります。

回答:


18

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

/some/static/page.html

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

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

別の方法として、Apacheハンドラーは便利に聞こえます:

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

次のディレクティブにより、html 拡張子を持つファイルのリクエストがfooter.plCGIスクリプトの起動をトリガーし ます。

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

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

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


誰かがmod_rewriteソリューションの例を提供できますか?(具体的にはhtmlinjector.phpのコンテンツ)
Asaf

1
これで苦労あなたのそれらのために-忘れてはいけないScriptAlias<Directory /some/static/>...</Directory><Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>私は、ユーザーの回答を改ざんする必要はありませんが、あなたが要求した場合、私はより多くの情報を与えるなど。
シュリダールSarnobat

@asdf例:<?php ob_start(); include("/some/static/page.html"); $contents = ob_get_contents(); ob_end_clean(); echo str_replace('</head>', '<script async>Some script content goes here like adsense code</script></head>', $contents) ?>$ contentを使用して、残りのページコンテンツをロードします。あなたはhtmlinjector.phpまたは何としてこのファイルを保存して、このようなあなたのhtaccessファイルでそれを呼び出すことができますOptions +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
ガブリエルNwoffiah II

20

なぜこれが回答リストに記載されていないのか分かりません。この質問を見るのに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で本当に上位にランクされており、フォーラムに関してはそれほど多くありません。


1
それが断然最良の解決策であり、私は同様の問題を見つけることができました。共有してくれてありがとう!
ハラルド

4

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

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


うーん、もし私がそれを正しく理解すれば、mod_proxy_htmlは完全に新しいコードスニペットを追加することができませんか?
ノード

確かではありませんが、あなたがさらに追加したので、トマラック司令官の答えは良く聞こえます。あなたはハッカーの国にいます。Webページの作成は、Apacheの目的ではなく、コンテンツを提供するためのものです。
カイルブラント

HTMLページを書き換えることができるスタンドアロンプ​​ロキシのようなものがあるかもしれないと考えました。MySQL Proxy for MySQLのようなもの。たぶん、Privoxyがこれを行うことができます。
ノード

@Kyle Brandt:LOL-軍のランクについての言及は、正式にあなたをトレキーにすると思います。これは私の一日を作りました。:)
トマラック09

4

mod_rewriteとSSIでこれを行うことを好むでしょう。

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

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

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

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

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


1
これにshtmlを使用したい主な理由は、リクエストごとに外部CGIを呼び出すと、ロードの問題が発生する可能性があるためです。
アレックスレーマン

4

ここでmod_sedが適しています。たとえば、終了するheadタグまたはbodyタグに一致する出力フィルターを作成し、その前にhtmlを挿入できます。



1

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


1

以下のディレクティブを使用して、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

Modレイアウトは現在廃止されており、外部スクリプトを呼び出すオーバーヘッドが必要ない場合、私にとって有効な解決策は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"

0

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

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

mod_layout.soをWindowsにインストールした後、次のコードを.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ですが、どこにでも置くことができます、ちょうど正しい道を与える、あなたは大丈夫だよ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.