Как внедрить 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 Handlers могут быть полезны:

Модификация статического содержимого с использованием скрипта CGI

Следующие директивы будут вызывать запросы файлов с html расширением для запуска footer.plсценария CGI.

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

Затем скрипт CGI отвечает за отправку первоначально запрошенного документа (на который указывает PATH_TRANSLATEDпеременная среды) и внесение любых изменений или дополнений по желанию.

Это более или менее то, что сделал бы подход mod_rewrite, только с меньшим количеством хакерских атак.

Томалак
источник
Может кто-нибудь привести пример решения mod_rewrite? (в частности, содержание htmlinjector.php)
Асаф
1
Для тех из вас , борется с этим - не забудьте ScriptAliasи <Directory /some/static/>...</Directory>, и <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>т.д. Я не хочу вмешиваться в ответ пользователя, но если вы спрашиваете, я дам больше информации.
Шридхар Сарнобат
@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);
?>

Это изменит все «а» на «а».

Обязательно включите фильтр в вашем httpd.conf, например так:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Этот вопрос занимает очень важное место в Google, и там не так много с точки зрения форумов

Merc
источник
1
На сегодняшний день это лучшее решение, которое я смог найти для аналогичной проблемы. Большое спасибо за обмен!
harald
4

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

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

Кайл Брандт
источник
Хм, если я правильно понял, mod_proxy_html не способен добавить полный новый фрагмент кода?
Узел
Не уверен, что теперь, когда вы добавили больше, ответ командира Томалака звучит лучше. Я бы сказал, что вы попадаете в страну хакерских атак, а создание веб-страниц - это не то, для чего предназначен Apache, а то, что вы обслуживаете контент.
Кайл Брандт
Я подумал, что, возможно, существует какой-то автономный прокси, который может переписать HTML-страницы. Что-то вроде MySQL Proxy для MySQL. Может быть, Privoxy мог бы сделать это.
Узел
@ Кайл Брандт: LOL - я думаю, что упоминание о воинском звании официально делает вас трекки. Это сделало мой день. :)
Томалак
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 . Например, вы можете создать выходной фильтр, который соответствует закрывающей метке заголовка или тела, и вставить HTML-код перед ним.

cwarden
источник
1

Будет ли полезным модуль mod_perl?

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

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

CK.
источник
Спасибо, я посмотрю, на данный момент мы склонны к httpd.apache.org/docs/2.0/handler.html с пользовательским footer.pl
Node
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 sed, чтобы соответствовать первой строке документа (1 с) и добавить туда код сценария заголовка, а также последнюю строку ($ 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
источник
0

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

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

Леон Каден
источник