Як вставити HTML-код на кожну сторінку HTML?


23

У мене з'являється Apache web serverстатична HTML-сторінка. Чомусь я не можу змінити самі файли, але все ж хочу ввести трохи HTML в кожну сторінку, що подається.

Це можливо за допомогою mod_proxy? Якщо ні, то хтось може порекомендувати програмне забезпечення, яке надає таку функцію?

EDIT: я повинен вставити банерну рекламу (наприклад, a 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);
?>

Це змінить усі "a" s на "A" s.

Обов’язково ввімкніть фільтр у своєму httpd.conf, наприклад:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Це питання посідає реальну позицію в Google, і там не так вже й багато з точки зору форумів


1
Це, безумовно, найкраще рішення, мені вдалося знайти подібну проблему. Дуже дякую за обмін!
Харальд

4

Ось підручник про те, як використовувати mod_proxy_html для редагування посилань на веб-сторінці (вміст). Можливо, ви зможете застосувати це змінення html, який ви хочете.

ОНОВЛЕННЯ: Ви впевнені, що хочете пройти цей маршрут? Я думаю, що Apache призначений для обслуговування вмісту, а не для його створення. Це, ймовірно, піде в оглядовій частині рамки MVC. Причиною цього я не рекомендував би є те, що ви порушуєте правило модульності . Ваш веб-додаток буде переплітатися з додатком, який його сервер, ускладнюючи майбутні оновлення, переміщення тощо.


Гм, якщо я зрозумію, що mod_proxy_html не в змозі додавати нові фрагменти коду?
Вузол

Не впевнений, тепер, коли ви додали більше, відповідь командира Томалака звучить краще. Ви б знаходитесь у країні хакерства, я б сказав, створення веб-сторінок насправді не є тим, для чого Apache, це для подачі вмісту.
Кайл Брандт

Мені здалося, що може бути якийсь окремий проксі, який міг би переписати HTML-сторінки. Щось на зразок MySQL Proxy для MySQL. Можливо, Privoxy міг це зробити.
Вузол

@Kyle Brandt: LOL - Я думаю, що згадка про військове звання офіційно робить тебе похідним. Це зробило мій день. :)
Томалак

4

Я вважаю за краще це робити з mod_rewrite та SSI.

Спочатку введіть шлях до змінної середовища

ПерепишітьCond% {IS_SUBREQ} false
Перепишіть ^ (/.* \. 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 перед цим.



1

Ви можете використовувати mod_substitute Apache для введення 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 . Ви можете використовувати 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

Я можу вставити 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 module / 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, але ви можете розмістити його будь-де , просто дайте вірний шлях, вам буде добре

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.