How to inject HTML code into every delivered HTML page?

48,236

Solution 1

You could do this: Work with mod_rewrite to change requests from

/some/static/page.html

to

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

then use PHP (or whatever you find appropriate) to do the file-manipulation. Add an output cache to improve performance.

As an alternative, Apache Handlers sound helpful:

Modifying static content using a CGI script

The following directives will cause requests for files with the html extension to trigger the launch of the footer.pl CGI script.

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

Then the CGI script is responsible for sending the originally requested document (pointed to by the PATH_TRANSLATED environment variable) and making whatever modifications or additions are desired.

This is more or less what the mod_rewrite approach would do, only with less hackery.

Solution 2

I am not sure why this hasn't been mentioned in the list of answer. Sorry if it took me 2 years to see this question...

The easiest, most powerful way to do what you want to do what you want is using an Apache filter.

Just have:

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

A possible script:

#!/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);
?>

This will change all "a"s into "A"s .

Be sure to enable filter in your httpd.conf, like this:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

This question ranks really up in Google and there isn't much out there in terms of forums

Solution 3

Here is a tutorial on how to use mod_proxy_html to edit the links on a webpage ( the content). You might be able to apply this modify the html you want.

UPDATE: Are you sure you want to go this route? I think Apache is meant to serve content, not create it. This would probably go in the view part of a MVC framework. The reason I wouldn't recommend this is you are breaking the rule of modularity. Your web application will be intertwined with the application that server it, complicating future upgrades, moves, etc.

Solution 4

mod_sed is a good fit here. You can create an output filter that matches the closing head or body tag, for example, and insert your html before it.

Solution 5

I would prefer to do this with mod_rewrite and SSI.

First put the path into an environment variable

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

then process that in the shtml file

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

Parts of this solution are based on a stackoverflow question: https://stackoverflow.com/questions/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 )

Share:
48,236

Related videos on Youtube

Node
Author by

Node

nothing to say

Updated on September 17, 2022

Comments

  • Node
    Node almost 2 years

    I've got an Apache web server that delivers static HTML pages. For some reason I can't change the files themselves, but I still want to inject some HTML into every page that is being served.

    Is this possible with mod_proxy? If not, could anyone recommend a software that provides such a feature?

    EDIT: I have to insert some kind of banner ad (e.g. a javascript) and a tracking pixel.

  • Node
    Node almost 15 years
    Hm, if I get it right mod_proxy_html is not capable to add complete new code snipets?
  • Kyle Brandt
    Kyle Brandt almost 15 years
    Not sure, now that you have added more, Commander Tomalak's answer sounds better. You are in the land of hackery I would say, creating web pages isn't really what Apache is for, it is for serving up content.
  • Node
    Node almost 15 years
    I tought that there is maybe some kind of standalone proxy which could rewrite html pages. Something like MySQL Proxy for MySQL. Maybe Privoxy could do this.
  • Tomalak
    Tomalak almost 15 years
    @Kyle Brandt: LOL - I think the mention of the military rank officially makes you a trekkie. This made my day. :)
  • Node
    Node almost 15 years
    Thx, I'll have a look, at the moment we tend to httpd.apache.org/docs/2.0/handler.html with a custom footer.pl
  • Alex Lehmann
    Alex Lehmann almost 15 years
    My main reason to want to use shtml for this would be that calling an external CGI for each request might cause load problems.
  • maestro416
    maestro416 over 11 years
    That's by far the best solution, i was able to find for a similar problem. Thanks very much for sharing!
  • Asaf
    Asaf about 8 years
    Can someone give an example of the mod_rewrite solution? (specifically the content of htmlinjector.php)
  • Sridhar Sarnobat
    Sridhar Sarnobat over 7 years
    For those of you struggling with this - don't forget ScriptAlias and <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>etc. I don't want to tamper with the user's answer but if you request, I will give more info.
  • Gabriel Nwoffiah II
    Gabriel Nwoffiah II almost 6 years
    @asdf Example: <?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) ?> use $content to load the rest of the page content. you can save this file as htmlinjector.php or whatever and call it in your htaccess file like this: Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
  • Khom Nazid
    Khom Nazid over 2 years
    On a shared hosting server this may not be available. Anyway how would one find the closing body tag and insert a Google Analytics code just before it?