在 web form 编程中,一个完整的 url 是一般是这样的:
http://yourdomain.com/dir/file.aspx
程序员在编写指向 file.aspx 这个页面的代码的时候,往往不知道项目会部署到什么域名中,又或者测试的时候所使用域名与正式环境所使用域名不相同。在 IIS 中,还有在一个网站中创建应用程序的做法,更有多个域名指向同一个网站的情况……可能在网页部署的时候,是这样的:
http://app1.yourdomain.com/dir/file.aspx
http://yourdomain.com/app1/dir/file.aspx
这样,如果使用完整的 url(绝对路径),部署的域名不同或端口不同或应用不同,你都要修改你的代码中的 url。
为了避免这样的情况,那么就要使用相对路径,前端工程师编写的 html 文件,会这样写:/dir/file.aspx (这是相对于域名,也就是根目录的路径,与代码本身的目录位置无关)
如果指向 file.aspx 的代码在同一个目录下,也可以:file.aspx
如果在上一层目录中:dir/file.aspx
如果在下一层目录中:../file.aspx
如果在下一层目录的下一层目录中:../../file.aspx
(以上四种是相对于代码 目录 位置的路径,代码 目录 位置变动之后,就不再准确)asp.net 还支持一种相对路径写法:
~/dir/file.aspx
这种写法在 asp.net 中叫做“虚拟路径”,属性名是“VirtualPath”。只能写在支持它的服务器端控件中,根据代码的目录位置,经过程序处理,它生成到客户端的路径可能是:
file.aspx../file.aspx
../../file.aspx
也就是说,它会被生成浏览器能够识别的路径,这种写法是不能直接被浏览器识别的,必须通过 asp.net 程序的处理。
这种写法的作用和相对于域名的路径相同:
~/dir/file.aspx 等同于 /dir/file.aspx
之所以需要这种写法,是需要兼容 IIS 中在网站下面添加应用程序和虚拟目录的情况,也就是即使项目部署到 http://yourdomain.com/app1,这种写法不用修改,因为它被 asp.net 程序处理成相对于代码 目录 位置的路 径。 而相对于域名的路径 /dir/file.aspx ,则会指向错误。相对于代码 目录 位置的写法 ../file.aspx 是不受影响的 。我不知道这种写法在 asp.net mvc 中会发生什么情况,它自带的路由功能,使得代码的目录位置与实际访问的路径已经没有关联。其实在 mvc 以前,你使用了 url 重写同样如此。
我比较喜欢 /dir/file.aspx 这种相对于域名的写法。因为访问路径其实比较容易确定,一旦网站部署,改动并不会太频繁,因为它可能被用户收藏,也可能被搜索引擎抓取了。
相对于访问路径,改动得更频繁的,可能是代码的目录位置。现在的 web 编程,javascript 代码、异步请求越来越多,一个 url 可以被选择写在多个目录位置中。可能是被前端工程师写在 html 文件、js 文件中,也可能被后端程序员写在 aspx、cshtml、cs 文件中。
根据帖子:http://bbs.csdn.net/topics/392065120 整理。