如何创建自己的URL协议?(例如so://…)[关闭]


212

我见过:

  • http://www...
  • ftp://blah.blah...
  • file://blah.blah...
  • unreal://blah.blah...
  • mailto://blah.blah...

您看到的第一个部分是什么http

我可以自己注册吗?


5
不知道这是否需要c#和.net标记,它是否比这更广泛。
罗布·赫鲁斯卡

这还算公平。我只是用这种方式标记了它,因为我们打算使用C#来实现类似的东西。不过谢谢 :-)
迈克尔·贝克

14
正确的名称是“方案”(请参阅​​RFC 2616和2396)。即使许多URL方案都是以协议命名的,但这并不意味着访问资源的唯一方法就是通过协议
Marek 2010年

协议有两种类型,但我不知道用什么术语来区分它们。“文件”和“ mailto”协议在客户端中处理。在服务器中处理“ http”和“ ftp”协议。最初,当我想要在服务器中处理某些内容时,我对浏览器中处理的协议答案感到困惑。
user34660 '04

Answers:


203

与该部分HTTP://FTP://等被称为URI方案

您可以通过注册表注册自己的注册表。

HKEY_CLASSES_ROOT/
  your-protocol-name/
    (Default)    "URL:your-protocol-name Protocol"
    URL Protocol ""
    shell/
      open/
        command/
          (Default) PathToExecutable

来源:https : //www.iana.org/assignments/uri-schemes/uri-schemes.xhtml,http : //msdn.microsoft.com/zh-cn/library/aa767914( v= vs.85).aspx


19
非Windows操作系统呢?
Bdoserror

9
“非Windows操作系统呢?” 它是特定于应用程序的。我认为它实际上也是Windows上特定于应用程序的(这不会使一切神奇地起作用)。
Calum

2
定义一切。注册表项告诉Windows将带有该协议的Uri传递给指定的应用程序,其他所有内容应由应用程序本身处理。
James Gregory

5
可插拔协议处理程序绝对是一个更好的选择。

8
(Default)这里的意思是空字符串。不要从字面上看。
deerchao

56

打开记事本并将下面的代码粘贴到其中。将“ YourApp”更改为您的应用名称。将其保存到YourApp.reg,然后在资源管理器中单击以执行它。而已!干杯! 欧文·汉吉斯(Erwin Haantjes)

REGEDIT4

[HKEY_CLASSES_ROOT\YourApp]
@="URL:YourApp Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\YourApp\DefaultIcon]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\""

[HKEY_CLASSES_ROOT\YourApp\shell]

[HKEY_CLASSES_ROOT\YourApp\shell\open]

[HKEY_CLASSES_ROOT\YourApp\shell\open\command]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\" \"%1\" \"%2\" \"%3\" \"%4\" \"%5\" \"%6\" \"%7\" \"%8\" \"%9\""

2
如何从资源管理器中调用,URL是什么
imp

@imp,从(互联网)资源管理器中调用.reg文件不是一个聪明的主意。您可以使用start命令来执行reg文件,例如“ start yourregfile.reg”,但是您会从操作系统得到提示信息,以确保将其添加到注册表中。为此,用户必须具有管理员权限。
Codebeat

实际上,我是在问这个问题stackoverflow.com/questions/24265292/…
小鬼

3
reg文件中的%1%2等是您应用的参数。因此,如果您执行YourApp.exe“您的参数”,那么%1 ==“您的参数”
Codebeat 2014年

1
仅%1很重要,无法在URL%2和%3等中指定
Trident D'Gao

39

对于每种浏览器而言,这是不同的,在IE和Windows中,您需要创建它们称为可插入协议处理程序的内容。

基本步骤如下:

  1. 实现IInternetProtocol接口。
  2. 实现IInternetProtocolRoot接口。
  3. 实现IClassFactory接口。
  4. 可选的。实现IInternetProtocolInfo接口。事务处理程序提供对HTTP协议的支持。
  5. 如果实现了IInternetProtocolInfo,请提供对PARSE_SECURITY_URL和PARSE_SECURITY_DOMAIN的支持,以便URL安全区域管理器可以正确处理安全性。为您的协议处理程序编写代码。
  6. 提供对BINDF_NO_UI和BINDF_SILENTOPERATION的支持。
  7. 在注册表中HKEY_CLASSES_ROOT \ PROTOCOLS \ Handler下为协议处理程序添加子项。
  8. 在子项下创建一个字符串值CLSID,并将该字符串设置为协议处理程序的CLSID。

有关Windows方面的更多详细信息,请参阅MSDN上的“关于异步可插拔协议”。Windows SDK中也有一个示例。

一个快速的Google也在codeproject上显示了这篇文章:http : //www.codeproject.com/KB/IP/DataProtocol.aspx

最后,作为安全人员,我必须指出,此代码需要经过严格的处理。这具有很高的风险,因为要可靠地执行此操作,就不能在托管代码中执行,而必须在C ++中执行(我想您可以使用VB6)。您应该考虑是否确实需要这样做,如果需要,请仔细设计并安全地对其进行编码。攻击者只需在页面上添加链接即可轻松控制传递给您的内容。例如,如果您有一个简单的缓冲区溢出,那么没有人可以这样做:<a href="custom:foooo{insert long string for buffer overflow here}"> Click me for free porn</a>

强烈考虑使用strsafe和VC8及更高版本的编译器中包含的新安全CRT方法。如果您不知道我在说什么,请参阅http://blogs.msdn.com/michael_howard/archive/2006/02/27/540123.aspx


6
这只是一个诱使用户点击的示例。
Peter Oehlert

请解释一下:“因为要可靠地执行,所以不能在托管代码中执行,而必须在C ++中执行”
LogicDaemon

2
这是来自.Net 2.0运行时(请注意,其中包括3.0和3.5)时间范围。它在同一进程中不支持不同的CLR运行时,因此,如果我编写了1.0处理程序,而您编写了2.0处理程序,并且我们的两个产品均安装在客户计算机上,则我们将确保每次浏览器均崩溃它发射了。4.0运行时试图解决此问题,但我的回忆是仍然有一些边界情况需要关注。但是要点是要在4.0之前绝对避免将.Net对象用于本机进程中的插件,并且可能仍然需要考虑一些特殊情况。
彼得·欧勒

19

这是已注册URI方案的列表。每个人都有一个RFC-定义它的文档,这几乎是一个标准。RFC告诉新应用程序(例如浏览器,ftp客户端等)的开发人员需要支持什么。如果需要新的基本协议,则可以使用未注册的协议。其他答案告诉您如何。请记住,您可以使用现有协议做很多事情,从而获得其现有的实现。


6
尽管有如何使协议在Windows中工作的技术细节,这是最重要的答案。除非已向IETF注册或使用实验性名称空间(例如X-前缀),否则您不应创建新的URI方案
Alnitak


2

这就是所谓的协议。阻止您制定自己的协议的唯一原因是:

  1. 编写某种可以理解该协议的浏览器或用户代理,无论其URL形式还是实际数据格式
  2. 编写了解该协议的服务器
  3. 最好有一个协议规范,以便浏览器和服务器可以继续一起工作。

Windows使#1变得非常简单,这在很多情况下是您实际需要的。即:

将应用程序注册到URL协议


1

第一部分称为协议,是的,您可以注册自己的协议。在Windows上(考虑到C#标签,我假设您正在执行此操作,对不起Mono粉丝),它是通过注册表完成



-10

您实际上并不需要这样做。我已经看到许多程序(例如emule)创建了自己的协议规范(这就是我所说的名称)。之后,您基本上只需要在注册表中设置一些值即可确定该程序处理的协议。我不确定是否有任何官方的协议说明注册表。如果您希望人们从他们的浏览器中打开您的应用程序,那么实际上并没有阻止您为自己的应用程序创建自己的协议说明符的方法。


4
-1:误导,使用不正确的命名法并且不提供任何实际价值
Marek 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.