我可以在节点HTTP服务器上注册自定义URL方案/协议吗?

时间:2018-04-28 05:43:14

标签: node.js http url-scheme

我希望能够使用Node HTTP API处理自定义URL方案。我想在网页内写这样的链接:bb。我想让Node HTTP Request Handler接收这种URL。

当我在我的网址中尝试这种自定义协议时,Chrome似乎没有发送请求,因为它格式不正确。所以在Node中我的HTTP服务器没有任何东西。

是否可以将HTTP服务器绑定到自定义URL方案或协议,如app://foo/bar

3 个答案:

答案 0 :(得分:1)

只有某些协议(例如http://https://)才会发送到您的nodejs http服务器。这就是问题所在。您的node.js服务器是一个http服务器。 Chrome浏览器只会使用它知道属于http服务器的http协议发送URL。

首先必须在浏览器中使用浏览器插件处理自定义协议,然后可以决定如何处理它。

您可能想要做的是自定义HTTP URL,例如:

http://yourserver.com/foo/bar

然后,您的node.js http服务器将获得请求的/foo/bar部分,您可以为此编写自定义处理程序。

回顾一下,://之前部分的URL的第一部分是协议。这告诉浏览器该URL应该与哪个协议一起使用。如果没有浏览器插件,浏览器只会支持某些内置协议,例如httphttpswswssmailto和其他一些人。

http服务器只能响应http协议,因此它只能用于希望使用http协议且浏览器知道使用http协议的URL。因此,您自己的浏览器不知道的协议不是浏览器知道如何处理的。它需要一个浏览器插件来告诉浏览器如何为自定义URL做什么。

  

当我尝试使用这种网址时,看起来Chrome似乎正在击打它,然后才能进入我在Node中的HTTP服务器。

是的,它不是浏览器中内置的可识别协议,因此浏览器不知道如何处理它或如何说出该协议。

  

是否可以将HTTP服务器绑定到这样的自定义URL方案?

仅使用浏览器加载项来注册并实现对自定义URL协议的支持。

答案 1 :(得分:1)

我为此制作了一个 npm 模块。

链接:https://www.npmjs.com/package/protocol-registry

因此,要在 nodejs 中执行此操作,您只需要运行以下代码:

首先安装它

npm i protocol-registry

然后使用下面的代码来注册您的条目文件。

const path = require('path');

const ProtocolRegistry = require('protocol-registry');

console.log('Registering...');
// Registers the Protocol
ProtocolRegistry.register({
    protocol: 'testproto', // sets protocol for your command , testproto://**
    command: `node ${path.join(__dirname, './index.js')} $_URL_`, // $_URL_ will the replaces by the url used to initiate it
    override: true, // Use this with caution as it will destroy all previous Registrations on this protocol
    terminal: true, // Use this to run your command inside a terminal
    script: false
}).then(async () => {
    console.log('Successfully registered');
});

然后假设有人打开 testproto://test 然后将启动一个新终端执行:

node yourapp/index.js testproto://test

答案 2 :(得分:0)

基于另一个答案的评论主题,我想我明白你要做的是什么。

我听说您要在localhost之外提供一些文件,但根本不会污染现有网络服务器的命名空间。

我有几种奇怪的替代解决方案:

  1. 只需选择一个不太可能被用户使用的命名空间。你可以从下划线或美元符号开始?或者你可以只是一个非常随机的数字。
  2. 您可以提供文件,但仅限于存在带有非常随机字符串的URI参数。 PHP这样做是为了提供PHP徽标。
  3. 如果不创建浏览器加载项,您无法真正更改方案,但执行可以控制TCP端口。您可以在第二个端口上启动第二个Web服务器。
  4. 您可以使用第二个域名。只需注册一个域并将A记录指向127.0.0.1即可。现在,在localhost上运行的web服务器可以检出Host:标头,并在符合您的特殊主机名的情况下提供文件。