Как вводить HTML-код на каждую поставляемую HTML-страницу?

У меня есть Apache web server, который предоставляет статические HTML-страницы. По какой-то причине я не могу изменить сами файлы, но я все же хочу вставить некоторый HTML на каждую страницу, которая обслуживается.

Возможно ли это с помощью mod_proxy? Если нет, можете ли кто-нибудь рекомендовать программное обеспечение что обеспечивает такую ​​функцию?

EDIT: Мне нужно вставить какое-то рекламное объявление (например, javascript) и пиксель отслеживания.

22 голоса | спросил Node 27 J000000Monday09 2009, 16:16:57

10 ответов


18

Вы можете сделать это: работать с 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, только с меньшим количеством хакеров.

ответил Tomalak 27 J000000Monday09 2009, 16:44:11
19

Я не уверен, почему это не упоминалось в списке ответов. Извините, если мне понадобилось 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, и там не так много в плане форумов

ответил Merc 7 J0000006Europe/Moscow 2012, 05:03:02
4

Вот учебник о том, как использовать mod_proxy_html , чтобы отредактировать ссылки на веб-странице (содержание). Возможно, вы сможете применить это изменение html, который вы хотите.

UPDATE: Вы уверены, что хотите пройти этот маршрут? Я думаю, что Apache предназначен для обслуживания контента, а не для его создания. Вероятно, это займет часть структуры MVC. Причина, по которой я бы не рекомендовал это, заключается в том, что вы нарушаете правило модульности . Ваше веб-приложение будет переплетено с приложением, которое его обслуживает, усложняя будущие обновления, перемещения и т. Д.

ответил Kyle Brandt 27 J000000Monday09 2009, 16:25:25
4

Я бы предпочел сделать это с помощью mod_rewrite и SSI.

Сначала поместите путь в переменную среды

RewriteCond% {IS_SUBREQ} false
RewriteRule ^ (/.* \. Html) /page.shtml [E: имя_файла: $ 1]

затем обработайте это в файле shtml

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

(части этого решения основаны на вопросе stackoverflow https://stackoverflow.com/questions/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

ответил Alex Lehmann 28 J000000Tuesday09 2009, 15:27:32
4

mod_sed отлично подходит. Например, вы можете создать выходной фильтр, который соответствует закрывающей головке или тегу тела, и вставить html перед ним.

ответил cwarden 26 Jpm1000000pmThu, 26 Jan 2012 20:47:50 +040012 2012, 20:47:50
1

Будет ли использоваться mod_perl-модуль?

http: //search.cpan. орг /~ Gozer /apache2-Макет-0,6 /Библиотека /apache2 /Layout.pm

Это может сделать то, что вы хотите, или, по крайней мере, указать вам в правильном направлении.

ответил CK. 27 J000000Monday09 2009, 17:45:59
1

Вы можете использовать Apache mod_substitute для ввода html в исходящие ответы с использованием некоторых критериев или регулярных выражений. Здесь является объяснением того, как достичь этого.

ответил Kayvan 15 MaramThu, 15 Mar 2012 02:26:24 +04002012-03-15T02:26:24+04:0002 2012, 02:26:24
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 /Скот /хобби /апач /

ответил Roy Rico 29 J000000Wednesday09 2009, 01:39:42
0

Я могу вставить html на все страницы через Apache, но только для сайта, размещенного моим apache, а не для всего сайта, хотя мой прокси-сервер Apache.

вот как это работает. Я установил XAMPP, скачаю mod_layout 5.1 для apache 2.4. (install mod_layout прост, если вы используете XAMPP для Windows, просто скачайте mod_layout.so 5.1 для Windows и поместите его в папку apache-модуля $ home /apache /module, затем добавьте конфигурацию DSO в ваш модуль httpd.conf для модулей layoutModule LoadModule /mod_layout.so - если вы используете linux или другие os, вы должны скачать mod_layout.so для linux, затем запустите команду 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, но вы можете поставить это где угодно, просто дайте правильный путь, вы будете в порядке

ответил Leon Kaden 25 FebruaryEurope/MoscowbThu, 25 Feb 2016 18:46:06 +0300000000pmThu, 25 Feb 2016 18:46:06 +030016 2016, 18:46:06
0

Модификация макета теперь устарела, и если вы не хотите накладных расходов на вызов внешнего скрипта, лучшим решением, которое сработало для меня, было 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"
ответил MohitC 7 PMpThu, 07 Apr 2016 12:59:58 +030059Thursday 2016, 12:59:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132