Apache的mod_rewrite等同于node.js?

有没有一个等效的Node.js模块,做Apache的mod_rewrite呢? 还是有一个标准的语言结构,提供等效的function?

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

正如以前的答案所build议的,你需要自己写; 前两个答案都是专门处理不同path的。

您可能会发现我的节点反向代理有帮助,因为它有很多代码来处理重写规则。 这与以前的答案不同,因为它允许你在“/ people /([az] *)”这样的规则上匹配,并redirect到“/cgi-bin/index.cgi?user=$1”,这是非常相似的到mod_rewrite。

如果你正在寻找一个好的modrewrite库。 你可能想看看connect-modrewrite

如果你有一个运行NodeJS的HTTP服务器,你有2个对象,请求和响应。 该请求包含请求的url。 使用require('url')你可以parsing这个请求的url,例如得到请求的path名。

你用它做什么,显然是自己的代码。 所以基于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/bartesting。 在那里你可以使用requestedURL.pathname来确定你想要做什么,理想情况下你可以创build你自己的 – 或者使用第三方的路由库。 他们是可用的,ExpressJS是一个非常有名的NodeJS框架,可能会帮助你处理很多事情,但我自己没有经验。

更多信息:

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

它看起来像这样:

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

尽pipe如此,为了获得良好的感觉,最好还是先使用低级的http接口。

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

我在我的本地框中开发单页面应用程序时使用它们(所以我不需要在本地configurationapache / 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 url会被代理到api.server.dev ,其余的会转到ui.server.dev 。 url前缀/send-to-api/send-to-ui是临时的,我用它们来区分哪些地方会被发送到各自的服务器。

是的,在redirect的情况下, proxy-middleware会将Location标题改为localhost:9000