Answers:
您可以这样做:使用mod_rewrite更改来自的请求
/some/static/page.html
至
/htmlinjector.php?url=/some/static/page.html
然后使用PHP(或任何您认为合适的方法)进行文件操作。添加输出缓存以提高性能。
另外,Apache处理程序听起来很有帮助:
使用CGI脚本修改静态内容
以下指令将导致对具有
html
扩展名的文件的请求触发footer.pl
CGI脚本的启动 。Action add-footer /cgi-bin/footer.pl AddHandler add-footer .html
然后,CGI脚本负责发送最初请求的文档(由
PATH_TRANSLATED
环境变量指向 )并进行所需的修改或添加。
这或多或少是mod_rewrite方法所能做的,只有很少的黑客。
ScriptAlias
和<Directory /some/static/>...</Directory>
, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>
等等。我不想篡改用户的回答,但是如果您有要求,我会提供更多信息。
<?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
我不确定为什么答案列表中没有提到这一点。抱歉,我花了两年时间才看到这个问题...
做您想做的事的最简单,最强大的方法是使用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”更改为“ A”。
确保在httpd.conf中启用过滤器,如下所示:
LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so
这个问题在Google中的排名确实很高,而在论坛方面却没有多少
这是有关如何使用mod_proxy_html编辑网页上的链接(内容)的教程。您可能可以应用此修改所需的html。
更新:确定要走这条路线吗?我认为Apache旨在提供内容,而不是创建内容。这可能会出现在MVC框架的视图部分。我不推荐这样做的原因是您违反了模块化规则。您的Web应用程序将与为其提供服务器的应用程序交织在一起,从而使将来的升级,移动等复杂化。
我更愿意使用mod_rewrite和SSI来做到这一点。
首先将路径放入环境变量
RewriteCond%{IS_SUBREQ}否 RewriteRule ^(/.* \。html)/page.shtml [E:文件名:$ 1]
然后在shtml文件中进行处理
<!-#include virtual =“ $ filename”->
(此解决方案的部分内容基于stackoverflow问题/programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832)
mod_perl模块会有用吗?
http://search.cpan.org/~gozer/Apache2-Layout-0.6/lib/Apache2/Layout.pm
这可能会满足您的要求,或者至少会为您指明正确的方向。
您可以使用以下指令查看apache的header和footer指令。
<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/
Mod Layout现在已过时,如果您不希望调用外部脚本的开销,那么对我最有效的最佳解决方案是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"
我可以通过Apache将html插入所有页面,但是只能插入由我的apache托管的网站,而不是通过apache代理服务器的所有网站。
这就是它的工作方式。我设置了XAMPP,为Apache 2.4下载了mod_layout 5.1。(安装mod_layout很简单,如果您在Windows上使用XAMPP,只需在Windows上下载mod_layout.so 5.1,然后将其放在apache模块文件夹$ home / apache / module中,然后将config DSO添加到您的httpd.conf中即可。LoadModule layout_module modules / mod_layout.so-如果您使用的是Linux或其他操作系统,则应下载适用于Linux的mod_layout.so,然后运行make命令进行安装)
在Windows下安装mod_layout.so之后,只需将此代码放在您的.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,但是您可以将其放置在任何位置,只要提供正确的路径,您就可以了