为什么Web服务中的尾随斜杠如此重要?

8
我测试了一个PHP和Python的Web服务。这个Web服务的地址是http://my.domain.com/my/webservice。当我在PHP中使用这个URL测试Web服务时,一切正常。但是,当我在Python中使用SOAPpy库调用同样的地址时,出现了错误。
下面是我用来与Web服务通信的Python代码:
from SOAPpy import WSDL
server = SOAPProxy('http://my.domain.com/my/webservice', namespace)
server.myFunction()

我从服务器得到的响应:
HTTPError: <HTTPError 301 Moved Permanently>

我发现如果在网络服务位置后面添加一个斜杠,它就可以工作了!
from SOAPpy import WSDL
server = SOAPProxy('http://my.domain.com/my/webservice/', namespace)
server.myFunction()

为什么缺少尾部斜杠会导致错误?
5个回答

20

它们是不同的URL。 http://my.domain.com/my/webservice 意味着在 my 文件夹中有一个名为 webservice 的文件。 http://my.domain.com/my/webservice/ 则意味着 my/webservice 文件夹内的默认文档。

许多Web服务器会自动更正此类URL,但并非必须这样做。


3

3
错误是301重定向,这意味着Web服务器将您重定向到带有斜杠结尾的URL。PHP会自动跟随此重定向,因此不会抛出错误,而Python则不会。您需要执行以下操作:
  1. 尝试连接到初始URL
  2. 捕获任何301重定向和可能的302重定向
  3. 如果有重定向,则尝试连接到该URL。
新的URL应在响应标头中可用。
希望对您有所帮助。

2

[免责声明:这是我从这里复制的答案。我知道有些人不喜欢这种复制,但这解释了为什么斜杠很重要。]

想象一下,你正在提供一个页面。

http://mydomain.com/bla

包含

<a href="more.html">Read more...</a>

点击后,用户的浏览器将检索http://mydomain.com/more.html。如果您选择提供了其他内容,则不会出现这种情况。

http://mydomain.com/bla/

如果 URL 指向目录,则浏览器将检索带有相同内容的 http://mydomain.com/bla/more.html。为了避免这种歧义,重定向会在 URL 指向目录时附加一个斜杠。

0

SOAP-URL的样式取决于服务器,是否需要斜杠取决于服务器和SOAP实现。

在您的情况下,我假设目标服务器是一个Apache服务器,SOAP URL实际上是一个包含您的SOAP处理脚本的目录。 当您在服务器上访问http://my.domain.com/my/webservice时,Apache认为该目录的正确地址是http://my.domain.com/my/webservice/并发送301重定向。

SOAP使用HTTP POST方法,客户端决定是否应该跟随重定向,我觉得它只是不期望有重定向。

其他的SOAP实现,比如Java中的Apache Axis,URL看起来像Servlets,例如http://domain.com/soap/webservice没有斜杠,这种情况下不带斜杠的URL是正确的,因为根本就不存在目录。

Axis对重定向也会失败,我想。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接