전달 된 모든 HTML 페이지에 HTML 코드를 삽입하는 방법은 무엇입니까?


23

나는있어 Apache web server정적 HTML 페이지를 제공하는 것을. 어떤 이유로 든 파일 자체를 변경할 수는 없지만 여전히 제공되는 모든 페이지에 HTML을 삽입하고 싶습니다.

이 가능 mod_proxy합니까? 그렇지 않다면 누구나 그러한 기능을 제공하는 소프트웨어를 추천 할 수 있습니까?

수정 : 배너 광고 (예 :) javascript와 추적 픽셀 을 삽입해야합니다 .

답변:


18

당신은 이것을 할 수 있습니다 : 요청을 변경하기 위해 mod_rewrite로 작업하십시오.

/some/static/page.html

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

그런 다음 PHP (또는 적절한 것으로 찾은 것)를 사용하여 파일 조작을 수행하십시오. 성능 향상을 위해 출력 캐시를 추가하십시오.

대안으로 Apache Handlers 가 도움이됩니다.

CGI 스크립트를 사용하여 정적 컨텐츠 수정

다음 지시문은 html 확장자 가있는 파일에 대한 요청으로 footer.plCGI 스크립트 의 실행을 트리거합니다 .

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

그런 다음 CGI 스크립트는 원래 요청 된 문서 ( PATH_TRANSLATED환경 변수가 가리키는)를 전송하고 원하는대로 수정하거나 추가 할 책임 이 있습니다.

이것은 mod_rewrite 접근 방식이 해커가 적은 경우와 거의 비슷합니다.


누군가 mod_rewrite 솔루션의 예를 들어 줄 수 있습니까? (특히 htmlinjector.php의 내용)
Asaf

1
이 고민 당신의 사람들을 위해 - 잊지 마세요 ScriptAlias<Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>I는 사용자의 대답을 조작하고 싶지 않지만 당신이 요청하는 경우, 내가 더 많은 정보를 줄 것 등.
Sridhar Sarnobat

@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
Gabriel 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"가 "A"로 바뀝니다.

다음과 같이 httpd.conf에서 필터를 활성화하십시오.

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

이 질문은 Google에서 실제로 순위가 높으며 포럼 측면에서 그다지 많지 않습니다


1
그것은 지금까지 가장 좋은 해결책이며 비슷한 문제를 찾을 수있었습니다. 공유해 주셔서 감사합니다!
harald

4

다음은 mod_proxy_html 을 사용 하여 웹 페이지 (컨텐츠)의 링크를 편집하는 방법에 대한 자습서 입니다 . 원하는 html을 수정하여 적용 할 수 있습니다.

업데이트 :이 경로를 가고 싶습니까? 나는 아파치가 컨텐츠를 만드는 것이 아니라 컨텐츠를 제공하기위한 것이라고 생각한다. 이것은 아마도 MVC 프레임 워크의보기 부분에있을 것입니다. 내가 이것을 권장하지 않는 이유 는 모듈성의 규칙을 어 기고 있기 때문입니다 . 웹 응용 프로그램은 웹 응용 프로그램과 서버를 연결하여 향후 업그레이드, 이동 등을 복잡하게 만듭니다.


흠, 내가 그것을 얻는다면 mod_proxy_html이 완전히 새로운 코드 조각을 추가 할 수 없습니까?
노드

확실하지 않습니다. 이제 더 많이 추가 했으므로 Tomalak 사령관의 대답이 더 잘 들립니다. 웹 페이지를 만드는 것이 실제로 Apache가 아닌 콘텐츠를 제공하기위한 것입니다.
Kyle Brandt

html 페이지를 다시 작성할 수있는 일종의 독립형 프록시가 있음을 고심합니다. MySQL 용 MySQL 프록시와 같은 것. 아마도 Privoxy가 이것을 할 수있을 것입니다.
Node

@Kyle Brandt : LOL-나는 군사 계급에 대한 언급이 공식적으로 당신을 트렉 키하게 만든다고 생각합니다. 이것은 나의 하루를 만들었다. :)
Tomalak

4

나는 mod_rewrite와 SSI로 이것을 선호합니다.

먼저 경로를 환경 변수에 넣으십시오.

RewriteCond % {IS_SUBREQ} 거짓
RewriteRule ^ (/.* \. html) /page.shtml [E : 파일 이름 : $ 1]

그런 다음 shtml 파일에서 처리하십시오.

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

(이 솔루션의 일부는 스택 오버 플로우 질문 /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832 기반으로합니다 )


1
shtml을 사용하려는 주된 이유는 각 요청마다 외부 CGI를 호출하면로드 문제가 발생할 수 있기 때문입니다.
Alex Lehmann

4

mod_sed 가 여기에 적합합니다. 예를 들어 닫는 헤드 또는 본문 태그와 일치하는 출력 필터를 만들고 HTML을 앞에 삽입 할 수 있습니다.



1

Apache mod_substitute를 사용하여 일부 기준 또는 정규식을 사용하여 html을 발신 응답에 삽입 할 수 있습니다. 이를 달성하는 방법에 대한 설명은 다음과 같습니다 .


1

아래 지시문을 사용하여 아파치의 머리글 및 바닥 글 지시문을 살펴볼 수 있습니다.

<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 Layout은 이제 더 이상 사용되지 않으며 외부 스크립트를 호출하는 오버 헤드를 원하지 않으면 저에게 가장 적합한 솔루션은 mod sed 였습니다. mod sed를 사용하여 doc의 첫 번째 줄 (1)을 일치시키고 거기에 헤더 스크립트 코드를 추가하고 마지막 줄 ($ 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

Apache를 통해 모든 페이지에 html을 삽입 할 수 있지만 Apache 프록시 서버를 통해 모든 사이트가 아닌 Apache에서 호스팅하는 사이트에만 html을 삽입 할 수 있습니다.

이것이 작동하는 방식입니다. XAMPP를 설정하고 Apache 2.4 용 mod_layout 5.1을 다운로드하십시오. (Windows 용 XAMPP를 사용하는 경우 mod_layout 설치는 간단합니다. Windows 용 mod_layout.so 5.1을 다운로드하여 아파치 모듈 폴더 $ home / apache / module에 넣은 다음 httpd.conf에 구성 DSO를 추가하십시오. LoadModule layout_module modules / mod_layout.so-Linux 또는 다른 os를 사용하는 경우 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입니다. , 올바른 길을 알려 주면 괜찮을거야

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.