如何在web开发中有效地管理根相对URL

如何在web开发中有效地管理根相对URL,web,path,root,absolute,Web,Path,Root,Absolute,我正在设计一个webapp,在其中我将把我的资源放在目录上 在我的HTMLs中,我会通过绝对路径/resources/引用该目录,但问题是,当我在web服务器中测试该路径时,现在的路径将是,并且使用绝对路径将查找//localhost/resources/ 我发现我可以使用./来引用webapp的相对根目录,它可以正常工作。但我不喜欢它的样子 我还有其他选择吗 使用绝对路径并将应用程序放置在服务器的根目录中 使用确定当前根目录的PHP/JSP变量 继续使用/ 还有一件事 提前谢谢 要重新表述

我正在设计一个webapp,在其中我将把我的资源放在目录上

在我的HTMLs中,我会通过绝对路径/resources/引用该目录,但问题是,当我在web服务器中测试该路径时,现在的路径将是,并且使用绝对路径将查找//localhost/resources/

我发现我可以使用./来引用webapp的相对根目录,它可以正常工作。但我不喜欢它的样子

我还有其他选择吗

  • 使用绝对路径并将应用程序放置在服务器的根目录中
  • 使用确定当前根目录的PHP/JSP变量
  • 继续使用/
  • 还有一件事

提前谢谢

要重新表述您的问题,您的站点必须在两种不同的配置下工作:

  • http://servername/mypage.htm
    ,以及
  • http://servername/SubSite/mypage.htm
第二种配置可能代表一个测试站点(甚至可能是开发人员机器上的本地主机)

图像、链接和样式表的所有路径都必须在两种部署上使用相对寻址

因此,设置图像的src=“/resources/mypic.jpg”会使子网站示例(在IIS中称为虚拟目录或应用程序)上的测试失败,因为/会告诉它查看
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开发人员知道,由于各种原因和代码,站点可能会部署在服务器根目录下或作为子站点