【问题标题】:apache mod_rewrite equivalent for node.js?node.js 的 apache mod_rewrite 等效项?
【发布时间】:2017-06-09 07:10:17
【问题描述】:

是否有与 Apache 的 mod_rewrite 相同的 Node.js 模块?还是有提供等效功能的标准语言结构?

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

【问题讨论】:

    标签: mod-rewrite node.js


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果你有一个运行 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 来确定您想要做什么,理想情况下您应该创建自己的 - 或使用第 3 方 - 路由库。它们是可用的,ExpressJS 是一个非常著名的 NodeJS 框架,它可能会帮助你处理很多事情,但我自己没有这方面的经验。

      更多信息:

      【讨论】:

      • +1 感谢 CharlesLeaf,这是相当低级的,但非常有用
      • 我怀疑是因为这不是问题的自然答案 - 但我仍然认为这是有用的回应。
      【解决方案3】:

      正如前面的答案所建议的,您需要自己编写;前两个答案都更倾向于专门处理不同的路径。

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

      【讨论】:

      • +1 这更像是一个 mod_rewrite 等价物,它使用了正则表达式。谢谢,史蒂夫,我会试试看。
      • 这是在 npm 上/会吗?我发现使用 npm 更容易。另外,如果我想使用一些使用 npm 解决依赖关系的 Node.js 托管服务提供商,我不能使用它。我不想将它重新打包到我的代码中。
      • 我没有考虑 npm - 主要是因为它被设计为“脚本”或“二进制”而不是库。但如果其他人有兴趣,这种情况可能会改变!
      • 这似乎现在可用:npmjs.com/package/connect-modrewrite
      【解决方案4】:

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

      它看起来像这样:

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

      不过,最好先弄乱较低级别的 http 接口,以获得良好的感觉。

      【讨论】:

        【解决方案5】:

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

        我在本地机器中开发单页应用程序时使用它们(因此我不必在本地配置 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 url 被代理到api.server.dev,其余的到ui.server.dev。 url 前缀 /send-to-api/send-to-ui 是临时的,我用它们来区分什么会去哪里,在发送到各自的服务器之前,它会被 connect 删除。

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

        【讨论】:

        • David,如何使用 modRewrite 模块重定向所有 404 错误?
        • github.com/tinganho/… 并检查如何使用 apache mod_rewrite... 这会给你一个想法
        猜你喜欢
        • 2016-05-19
        • 1970-01-01
        • 2011-10-12
        • 2016-08-23
        • 2013-05-19
        • 2018-06-13
        • 1970-01-01
        • 2018-10-31
        • 2022-01-14
        相关资源
        最近更新 更多