2011-05-04 2 views
7

Apache의 mod_rewrite가 수행하는 Node.js와 동일한 모듈이 있습니까? 동일한 기능을 제공하는 표준 언어 구문이 있습니까?node.js에 해당하는 아파치 mod_rewrite?

저는 Node를 시작하고 서버를이 플랫폼으로 변환하려고합니다.

답변

2

이전 답변에서 제안한대로 직접 작성해야합니다. 이전의 두 가지 대답은 특별히 다른 경로를 다루는쪽으로 더 지향되었습니다.

node reverse proxy은 재 작성 규칙을 처리하기위한 많은 코드가 있으므로 도움이 될 수 있습니다. 이것은 "/ people/([az] *)"와 같은 규칙을 비교하고 매우 유사한 "/cgi-bin/index.cgi?user=$1"로 리디렉션 할 수 있기 때문에 이전 답변과 다릅니다. mod_rewrite로.

+0

+1 이것은 정규식을 사용하는 것과 mod_rewrite가 더 비슷합니다. 고마워, 스티브. 나는 그것을 시험해 보겠다. – ampersand

+0

이 npm/this일까요? 나는 npm을 사용하는 것이 더 쉽다는 것을 안다. 또한 npm을 사용하는 Node.js 호스팅 제공 업체 중 일부를 사용하여 종속성 문제를 해결하려면이 방법을 사용할 수 없습니다. 나는 그것을 코드로 다시 패키징 할 필요가 없다. – ampersand

+0

나는 npm을 고려하지 않았습니다. 주로 라이브러리가 아닌 "스크립트"또는 "바이너리"로 설계 되었기 때문입니다. 그러나 다른 사람들로부터 관심이 있다면 그것은 바뀔 수 있습니다! –

3

NodeJS로 실행되는 HTTP 서버가있는 경우 두 개의 객체, 요청 및 응답이 있습니다. 요청에 요청 된 URL이 포함되어 있습니다. require ('url')를 사용하면 요청한 url을 구문 분석하고 예를 들어 요청 된 경로 이름을 얻을 수 있습니다.

그럼 어떻게 할 것인가는 분명히 자신의 코드에 달려 있습니다. 당신이 http://127.0.0.1:1337/foo/bar

var http = require('http'); 
http.createServer(function (req, res) { 
    var requestedURL = require('url').parse(req.url); 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.write("You requested " + requestedURL.pathname + "\n"); 
    res.end('Hello World\n'); 
}).listen(1337, "127.0.0.1"); 

을 테스트 할 수있는 : 그래서 당신은이 같은 끝낼 것 www.nodejs.org의 기본 예에 따라. requestedURL.pathname을 사용하여 원하는 작업을 결정할 수 있습니다. 직접 작성하거나 제 3 자 라우팅 라이브러리를 사용하는 것이 가장 이상적입니다. ExpressJS는 많은 것들을 처리하는 데 도움이 될 수있는 꽤 유명한 NodeJS 프레임 워크이지만 사용할 수있는 경험이 없습니다.

더 많은 정보 :

+0

사람이 설명 할 수로 변경됩니다? 그게 뭐가 잘못 됐어? .. – CharlesLeaf

+0

+1 CharlesLeaf에게 감사드립니다. 매우 낮은 수준이지만 매우 유용합니다. – ampersand

+0

질문에 대한 자연스러운 대답이 아니기 때문에 용의자입니다.하지만 여전히 유용한 응답이라고 할 수 있습니다. –

0

라우터는 실제로 "다시"하지 않기 때문에 당신이 기술적 아니지만 (동등한를 찾고 있다면 무엇이든) 거기에는 많은 라우터가 있습니다. (Express가 내장이되는) 가장 두드러진 연결 라우터 : https://github.com/senchalabs/connect

그것은 다음과 같이 보일 것입니다 :

app.get('/', function(req, res) { 
    res.end('hello, here is the home page.'); 
}); 

그것은에,하지만 주위에 먼저 낮은 수준의 HTTP 인터페이스와 혼란에 더 좋을 수도 그것을 위해 좋은 느낌을 얻으십시오.

0

다시 쓰기 모듈이 있습니다. 또한 미들웨어에서 다른 프록시 모듈과 함께 사용할 경우 역방향 프록시로 함께 작동합니다. 내 로컬 상자에서 단일 페이지 응용 프로그램을 개발하는 동안

내가 그들을 사용 (그래서 구성해야 그나마 아파치/nginx를 로컬)

이 CORS를 방지하고 (JS/CSS/이미지 제외) 모든 페이지를 보내려면 SPA가 작동하려면 index.html로 이동하십시오.나는 그것이 다시 및 규칙의 나머지를 건너 뛰고 싶어서 [L] 플래그를 사용

var connect = require('connect'); 
var modRewrite = require('connect-modrewrite'); 
var proxy = require('proxy-middleware'); 
var url = require('url'); 


var app = connect() 
    .use(modRewrite([ 
    "^\/api\/(.*)  /send-to-api/api/$1 [L]", 
    "^(.*)\/css\/(.*) /send-to-ui/css/$2  [L]", 
    "^(.*)\/js\/(.*)  /send-to-ui/js/$2  [L]", 
    "^(.*)\/images\/(.*) /send-to-ui/images/$2 [L]", 
    "^(.*)\/fonts\/(.*) /send-to-ui/fonts/$2 [L]", 
    "^(.*)    /send-to-ui/index.html [L]" 
    ])) 
    .use('/send-to-api', proxy(url.parse('http://api.server.dev/'))) // Don't forget the last backslash 
    .use('/send-to-ui', proxy(url.parse('http://ui.server.dev/'))) // Don't forget the last backslash 
    .listen(9000) 

확인합니다.

이 경우 /api URL 만 api.server.dev으로 프록시되고 나머지는 ui.server.dev이됩니다. URL 접두사 /send-to-api/send-to-ui은 임시적이며 어떤 위치로 갈지 구분하기 위해 사용합니다. connect에 의해 제거 된 후 해당 서버로 전송됩니다.

그리고 네, 리디렉션의 경우, proxy-middlewareLocation 헤더 내 대답이 -1'd 된 이유 localhost:9000

관련 문제