apache mod_rewrite等价于node.js?

时间:2011-05-04 21:23:05

标签: mod-rewrite node.js

是否有一个与Node.js相同的模块来执行Apache的mod_rewrite所做的事情?或者是否有提供等效功能的标准语言结构?

我刚开始使用Node并希望将我的服务器转换为此平台。

5 个答案:

答案 0 :(得分:3)

如果你有一个运行NodeJS的HTTP服务器,你有2个对象,请求和响应。该请求包含请求的URL。使用require('url'),您可以解析此请求的URL,例如获取所请求的路径名。

然后你用它做什么,显然取决于你自己的代码。因此,根据www.nodejs.org上的默认示例,您最终会得到类似的结果:

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");

您可以使用http://127.0.0.1:1337/foo/bar进行测试。在哪里可以使用requestedURL.pathname来确定您想要做什么,理想情况下,您可以创建自己的 - 或使用第三方 - 路由库。它们是可用的,ExpressJS是一个非常着名的NodeJS框架,它可以帮助你处理很多事情,但我自己也没有这方面的经验。

更多信息:

答案 1 :(得分:3)

如果您正在寻找一个好的modrewrite库。您可能需要查看connect-modrewrite

答案 2 :(得分:2)

正如之前的答案所示,你需要自己写;之前的两个答案都更倾向于专门处理不同的路径。

您可能会发现我的node reverse proxy很有帮助,因为它有很多处理重写规则的代码。这与之前的答案不同,因为它允许您匹配诸如“/ people /([az] *)”之类的规则并重定向到“/cgi-bin/index.cgi?user=$1”,这非常相似到mod_rewrite。

答案 3 :(得分:0)

如果你正在寻找一个等价物(虽然不是技术上,因为路由器实际上并没有“重写”任何东西),那里有很多路由器。最值得注意的是Connect路由器(在其上构建Express):https://github.com/senchalabs/connect

看起来像这样:

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

最好首先使用较低级别的http接口,以获得良好的感觉。

答案 4 :(得分:0)

有一个重写模块。当与中间件中的另一个代理模块一起使用时,它们作为反向代理一起工作。

我在本地框中开发单页应用程序时使用它们(所以我不必在本地配置apache / nginx)

这是为了避免CORS并将所有页面(js / css / images除外)发送到index.html以使SPA正常工作。

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)

检查我是否使用[L]标志,因为我希望它重写并跳过其余规则。

在这种情况下,只有/api网址会被代理到api.server.dev,其余网址会转到ui.server.dev。 网址前缀/send-to-api/send-to-ui是临时性的,我使用它们来区分将发送到哪里的内容,在发送到各自的服务器之前由connect删除。

是的,如果是重定向,proxy-middleware会将Location标题更改为localhost:9000