How to inject HTML code into every delivered HTML page?

Solution 1:

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 2:

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 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:

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 )


Solution 5:

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.