Node.js是否存在一个与Apache的mod_rewrite相同的模块?还是有一个标准的语言结构提供等效的功能?apache mod_rewrite相当于node.js?
我刚刚开始使用Node并希望将我的服务器转换为此平台。
Node.js是否存在一个与Apache的mod_rewrite相同的模块?还是有一个标准的语言结构提供等效的功能?apache mod_rewrite相当于node.js?
我刚刚开始使用Node并希望将我的服务器转换为此平台。
正如前面的答案建议,你需要自己写;前两个答案都更专注于处理不同的路径。
你可能会发现我的node reverse proxy有帮助,因为它有很多代码来处理重写规则。这与以前的答案不同,因为它允许你匹配诸如“/ people /([az] *)”之类的规则并重定向到“/cgi-bin/index.cgi?user=$1”,这是非常相似的mod_rewrite。
如果你有一个运行NodeJS的HTTP服务器,你有2个对象,请求和响应。该请求包含请求的网址。使用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'd?它出什么问题了? .. – CharlesLeaf 2011-05-05 16:10:24
+1谢谢CharlesLeaf,这是相当低级的,但是非常有用 – ampersand 2011-05-06 02:12:39
我怀疑是因为它不是一个自然的答案 - 但我仍然认为它是有用的答案。 – 2011-05-06 17:38:12
如果你正在寻找一个当量(虽然不是技术上的,因为路由器实际上并不 “改写”任何东西),那里有许多路由器。最引人注目的是连接路由器(根据其快速建):https://github.com/senchalabs/connect
它会是这个样子:
app.get('/', function(req, res) {
res.end('hello, here is the home page.');
});
这可能是更好的混乱与下级HTTP接口首先围绕虽然,得到一个很好的感觉。
如果你正在寻找一个很好的modrewrite库。你可能想看看connect-modrewrite
有一个重写模块。当与中间件中的另一个代理模块一起使用时,它们将作为一个反向代理协同工作。
我使用它们同时开发单页的应用程序在我的本地盒(所以我没有配置Apache/nginx的地方)
这是为了避免CORS并发送所有页面(除JS/CSS /图片)以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
。 url前缀/send-to-api
和/send-to-ui
是临时的,我用它们来区分将要发送到哪里的地方,它在发送到它们各自的服务器之前被connect
删除。
是的,在重定向的情况下,proxy-middleware
将改变Location
标题为localhost:9000
+1这是更多的mod_rewrite等同于使用正则表达式。谢谢,史蒂夫,我会试试看。 – ampersand 2011-05-06 02:13:31
这是在npm /它会吗?我发现使用npm更容易。另外如果我想使用一些使用npm解决依赖性的Node.js托管提供程序,我不能使用它。我不想将其重新打包到我的代码中。 – ampersand 2011-05-06 02:23:15
我不认为npm - 主要是因为它被设计成一个“脚本”或“二进制”而不是一个库。但如果有其他人的兴趣,这可能会改变! – 2011-05-06 17:37:10