2013년 11월 7일 목요일

meteor에서 특정 조건에서 head를 조작하기

server/header.js 식으로 server에서만 작동하는 코드를 만들자.

Fiber = Npm.require("fibers");
WebApp.connectHandlers.use(function(req, res, next) {
if (req.url==='/connect') {
res.writeHead(200, {'Content-Type': 'text/html'});
Fiber(function() {
res.write('<html>')
res.write('<head>');
res.write('<meta property="qc:admins" content="2311172222411526554572637573766534" />');
res.write('<head>');
res.write('<body></body>');
res.write('</html>')
res.end();
}).run();
} else {
next();
}
});

위 코드는 weiyun 인증의 경우인데 <meta property="qc:admins" ... 를 사이트에서 요구하는 경우이다.
이런 식으로 meta를 요구하는 경우가 종종 있는데 아마 구글 서비스 중에도 있을 듯. 사이트 도구? 아마 그럴 것이다.

저번에도 이야기 했지만 WebApp.connectHandlers 요거 좋은 놈이다.
서버쪽에서 특정 url로 들어왔을때 예외처리를 하고 싶다면 이걸 사용하면 된다.
예의 경우는 /connect 로 들어왔을 때만 예외처리를 하고 나머지는 그냥 next()로 넘겼다.

여기서 주목할 점은 meteor는 기본적으로 fiber 처리를 하지만 이 경우는 그냥 node.js를 사용하는 것이라 block이 되지 않도록 Fiber를 처리해준다.

페이스북의 경우
if (req.headers['user-agent'].indexOf('facebookexternalhit') !== -1) {
                res.writeHead(200, {'Content-Type': 'text/html'});
이런 식으로 'user-agent'를 조사해주면 되겠다.