如何在web开发中有效地管理根相对URL
我正在设计一个webapp,在其中我将把我的资源放在目录上 在我的HTMLs中,我会通过绝对路径/resources/引用该目录,但问题是,当我在web服务器中测试该路径时,现在的路径将是,并且使用绝对路径将查找//localhost/resources/ 我发现我可以使用./来引用webapp的相对根目录,它可以正常工作。但我不喜欢它的样子 我还有其他选择吗如何在web开发中有效地管理根相对URL,web,path,root,absolute,Web,Path,Root,Absolute,我正在设计一个webapp,在其中我将把我的资源放在目录上 在我的HTMLs中,我会通过绝对路径/resources/引用该目录,但问题是,当我在web服务器中测试该路径时,现在的路径将是,并且使用绝对路径将查找//localhost/resources/ 我发现我可以使用./来引用webapp的相对根目录,它可以正常工作。但我不喜欢它的样子 我还有其他选择吗 使用绝对路径并将应用程序放置在服务器的根目录中 使用确定当前根目录的PHP/JSP变量 继续使用/ 还有一件事 提前谢谢 要重新表述
- 使用绝对路径并将应用程序放置在服务器的根目录中
- 使用确定当前根目录的PHP/JSP变量
- 继续使用/
- 还有一件事
提前谢谢 要重新表述您的问题,您的站点必须在两种不同的配置下工作:
,以及http://servername/mypage.htm
http://servername/SubSite/mypage.htm
http://servername/resources
而不是http://servername/SubSite/resources
所以它不起作用
我的开发团队的立场是始终使用文档相对路径 因此,在mypage.htm的基本示例中,它位于网站树的根目录下(无论它位于文件系统或web服务器的何处),您可以设置图像的src=“./resources/mypic.jpg” 基本上,请记住,在html中,当您看到“/”时,它的意思是从这个页面。如果您需要进入一个目录(假设您在~/Reports/myreport.htm下还有另一个页面也需要显示该图像),您可以将该页面上图像标记上的源设置为src=“../resources/mypic.jpg”,这意味着进入一个级别 注意,我在那里做了一些鬼鬼祟祟的事情。在ASP.NET中,~/意味着网站的根,而不管它位于何处。我用它作为简写来反映网站的根。尽管在ASP.NET中,任何服务器端控件实际上都可以使用前面带有~/的URL,并且它会正确地将其解析为正确的路径 我今天在研究这个问题的其他部分时,将重点介绍我刚刚学到的另一个要点。在CSS文件中,如果使用文档相对路径指向图像等,则路径是相对于CSS文件的。这是一件好事,因为CSS文件相对于图像文件很少改变位置。CSS文件的作用是什么不过,我要谈谈我的下一点
到目前为止,我所解释的内容对基本网页非常有用,并且使它们非常可移植。一旦在不同的目录中有多个网页引用生成CSS、图像等HTML引用的代码或控件,您也需要修复这些路径 基本上,您需要修改这些URL(通常在您编写的代码或控件中),以获得访问您想要的资源所需的适当的/或 在ASP中,您可以使用VBscript使用Server.MapPath(“/resources/mypic.jpg”)获取相对于站点根目录所需的正确URL 在ASP.NET中,您可以使用Page.MapPath(“~/resources/mypic.jpg”)获取所需的正确URL 我还编写了一些函数来生成.NET中所需的正确的./or../slashing,如下所示:
public static string GetDotDotSlashesToRoot(string Path, bool IncludeTrailingSlash) {
System.Text.StringBuilder result = new System.Text.StringBuilder();
Path = Path.Replace("\\", "/");
Path = Path.Replace("~", string.Empty);
if (Path.Length > 0 && Path[0] == '/') Path = Path.Substring(1);
string slashless = Path.Replace("/", "");
for (int i = 0; i < Path.Length - slashless.Length; i++) {
result.Append("../");
}
if (!IncludeTrailingSlash && result.Length > 0) result = result.Remove(result.Length - 1, 1);
return result.ToString();
}
public静态字符串GetDotDotSlashesToRoot(字符串路径,bool IncludeTrailingSlash){
System.Text.StringBuilder结果=新建System.Text.StringBuilder();
路径=路径。替换(“\\”,“/”;
Path=Path.Replace(“~”,string.Empty);
如果(Path.Length>0&&Path[0]=='/')Path=Path.Substring(1);
字符串slashless=Path.Replace(“/”,“”);
for(int i=0;i0)结果=结果。删除(result.Length-1,1);
返回result.ToString();
}
如果需要的话,您可以运行该函数来转换为VB.net。我使用该函数将母版页设置为公开javascript全局变量JSPATHTOSITEROOT,这样我也可以通过JS为需要的任何路径添加前缀
对于PHP,我已经有一段时间没有涉及到这一点了,所以我只能给出一些指向我发布的其他代码的指针,以类似地解决这个问题:
该链接显示了如何使PHP包含嵌套像C/C++包含嵌套一样工作,但是您也可以使用相同的技巧来修复html的路径
我最后的总结是,如果有人交给你一个项目,其中的图像和css路径都以“/”开头,那么他们就无法通过测试。代码是不可移植的。21世纪的优秀web开发人员知道,由于各种原因和代码,站点可能会部署在服务器根目录下或作为子站点