为什么 IIS 不像 IIS Express 那样处理相对路径?

Why IIS doesn't handle relative path the same way IIS Express does?

当您使用 IIS Express 在 visual studio 中测试 Web 应用程序时,您将能够添加对这样的脚本文件的引用(在 ASPX 文件中):

<head>
    <script src="/Javascript/jquery-2.1.1.min.js" type="text/javascript" charset="utf-8"></script>
</head>

但是,当您在标准 IIS 服务器上部署完全相同的应用程序时(使用 Web 部署包),您将收到丢失错误 404,因为浏览器无法解析 url.

要修复它,我可以简单地从路径中删除斜杠:

<script src="Javascript/jquery-2.1.1.min.js" type="text/javascript" charset="utf-8"></script>

但是,这个问题不是关于如何解决 link 因为这个问题已经被问过很多次了。我想了解的是为什么 IIS Express 可以正确处理那些 url 而 IIS Express 不能?是安全问题(例如:浏览器在您自己的计算机上工作时可以访问您的本地文件,而在远程服务器上不是这样)还是设置问题没有在 web 包中导出?

根据您在评论中的回答,我了解到您的 IIS 服务器配置了类似 http://localhost/mysite/Javascript/... 而您的 IIS Express 设置更像是 http://localhost:8888/Javascript/...*

如果真的是这样的话,区别在于相对的 URL 以 / 开头表示它是相对于主机名部分的url 而没有初始 / 的相对 url 是相对于实际页面文件夹的。

在当前示例中,如果页面是 demo.htm

Server Base Page Relative Url Result Url
IIS http://localhost/mysite/demo.htm /Javascript/jquery-2.1.1.min.js http://localhost/Javascript/jquery-2.1.1.min.js
IISExpress http://localhost:8888/demo.htm /Javascript/jquery-2.1.1.min.js http://localhost/Javascript/jquery-2.1.1.min.js
IIS http://localhost/mysite/demo.htm Javascript/jquery-2.1.1.min.js http://localhost/mysite/Javascript/jquery-2.1.1.min.js
IISExpress http://localhost:8888/demo.htm Javascript/jquery-2.1.1.min.js http://localhost/Javascript/jquery-2.1.1.min.js

因为我认为您的 Javascript 文件夹是您网站的一部分,正如您在前面的 table 中看到的那样,带有前斜杠的 Url 不会指向右侧Url。另一方面,使用前斜杠访问根文件夹可以在网站内的任何位置使用。

在不同的站点上,另一种使两者行为相同的方法是修改 IIS Express 的项目属性(或直接修改 applicationHost.config 文件)这样它也使用虚拟目录而不是直接映射到根目录。