Apache가 정적 웹페이지를 즉시 수정하도록 하기
문제
나는 실험을 해왔다. woopra.com 웹 분석 도구입니다.작동하려면 각 페이지에 자바스크립트 코드를 추가해야 합니다.이는 범용 머리글이나 바닥글이 있는 보다 동적인 사이트에서는 충분히 쉬우나 완전히 정적인 HTML 페이지에서는 그렇지 않습니다.
나는 Apache 재작성 및 SSI의 조합을 사용하여 정적 HTML을 필수 코드로 "래핑"함으로써 이 문제를 해결하려고 시도했습니다.예를 들어...
Apache 구성을 다음과 같이 변경했습니다.
RewriteEngine On
RewriteCond %{REQUEST_URI} !=test.shtml
RewriteCond %{IS_SUBREQ} false
RewriteRule (.*)\.html test.shtml?$1.html
test.shtml 파일에는 다음이 포함되어 있습니다.
<script type="text/javascript">
var XXXXid = 'xxxxxxx';
</script>
<script src="http://xxxx.woopra.com/xx/xxx.js"></script>
<!--#set var="page" value="$QUERY_STRING" -->
<!--#include virtual= $page -->
아이디어는 다음과 같은 요청이 들어오는 것이었습니다.
/abc.html
다음으로 리디렉션됩니다.
/test.shtml?abc.html
그런 다음 shtml은 원본 파일을 응답 페이지에 포함합니다.
불행히도 그것은 계획대로 작동하지 않습니다 :) 누구든지 내가 뭘 잘못하고 있는지 보거나 대체 접근 방식을 제안할 수 있습니다.동일한 작업을 수행할 수 있는 아파치 모듈이 있습니까?바람직하게는 사이트별로 구성할 수 있습니다.
감사해요
베드로
해결책
내 생각에는 mod_filter_ext 당신이 찾고 있는 모듈입니다.예를 들어 짧은 Perl 스크립트를 작성하여 페이지에 JS 코드를 삽입하고 HTML 페이지를 처리하도록 등록할 수 있습니다.
while (<>) {
s/<html>/\Q<script>....\E/;
print $_;
}
다음과 같은 것을 사용할 수도 있습니다. sed
대체를 수행합니다.
다른 팁
페이지가 정적이라면 사이트의 모든 페이지를 전처리하고 필요한 자바스크립트를 각 페이지에 추가하는 대신 왜 즉시 페이지를 변경하겠습니까?이는 간단하고 아마도 더 효율적일 것입니다(변경할 페이지보다 페이지 조회수가 더 많을 것입니다).
이것은 다양한 방법으로 수행될 수 있습니다.인라인 교체를 위해 작은 Perl을 제안합니다.
좋습니다. 위 방법의 가장 큰 문제는 스크립트 태그를 외부에 배치하면 HTML 유효성이 손상된다는 것입니다. <html>
태그
나는 sed/awk 스크립트와 같은 HTML 파일에 대한 사전 프로세스 실행에 대해 다른 사람들의 의견에 동의합니다.
여기에 간단한 예가 있습니다. {스크립트 부분이 </head>
그리고 그 </head>
개행의 시작 부분에 있습니다
#!/bin/bash
cd /var/webserver/whatever/
grep -r '<\/head>' */*|grep "^.*\.html*:" >/var/tmp/tempfile.txt
((lines = $(wc -l /var/tmp/dom-tempfile.txt | awk '{print $1}')))
if [ $lines -gt 0 ]
then
while read line; do
sed 's/<script type="text\/javascript"> var XXXXid = "xxxxxxx"; <\/script><script src="http:\/\/xxxx\.woopra\.com\/xx\/xxx\.js"><\/script><\/head>/^<\/head>/g' $line>/var/tmp/tempfile.htm
mv /var/tmp/tempfile.htm $line
done < <(sed 's/\(^.*\.html*\):.*$/\1/' /var/tmp/tempfile.txt)
fi
exit 0
이후 구문 오류가 있을 수 있습니다. $page
는 따옴표에 포함되지 않지만 이것이 포함되지 않는 두 가지 주요 이유는 다음과 같습니다.
- /로 시작하는 경로에 가상을 포함해야 합니다. 예에서 쿼리 문자열은 abc.html이 아니라 /abc.html이어야 합니다.
다시 쓰기 규칙도 경로로 시작해야 하므로 다시 쓰기 규칙은 다음과 같아야 합니다.
RewriteRule ^(.*)\.html /test.shtml?$1.html