How to inject HTML code into every delivered HTML page?
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 thefooter.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 )
Related videos on Youtube
Comments
-
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 almost 15 yearsHm, if I get it right mod_proxy_html is not capable to add complete new code snipets?
-
Kyle Brandt almost 15 yearsNot 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 almost 15 yearsI 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 almost 15 years@Kyle Brandt: LOL - I think the mention of the military rank officially makes you a trekkie. This made my day. :)
-
Node almost 15 yearsThx, 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 almost 15 yearsMy main reason to want to use shtml for this would be that calling an external CGI for each request might cause load problems.
-
maestro416 over 11 yearsThat's by far the best solution, i was able to find for a similar problem. Thanks very much for sharing!
-
Asaf about 8 yearsCan someone give an example of the mod_rewrite solution? (specifically the content of htmlinjector.php)
-
Sridhar Sarnobat over 7 yearsFor 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 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 over 2 yearsOn 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?