如何在Web开发中有效管理root相对URL

时间:2011-09-19 16:19:39

标签: web path root absolute

我正在设计一个webapp,我将在http://www.site.com/resources/目录

上拥有我的资源

在我的HTML上,我会通过绝对路径/ resources /来引用该目录,但问题是当我在Web服务器中测试时,路径现在将是http://localhost/webapp/resources/并使用绝对路径将寻找// localhost / resources /

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

我还有其他选择吗?

  • 在服务器的ROOT目录中使用绝对路径并放置应用程序
  • 使用确定当前根目录的PHP / JSP变量
  • 继续使用./
  • 其他事情......

提前致谢!

1 个答案:

答案 0 :(得分:3)

要重新解决您的问题,您的网站必须以两种不同的配置工作:

  • http://servername/mypage.htm
  • http://servername/SubSite/mypage.htm

第二个配置可能代表一个测试站点(可能甚至是开发人员机器上的localhost)。

图像,链接,样式表的所有路径必须在任一部署中使用相对寻址工作。

因此,设置图像的src =“/ resources / mypic.jpg”将无法通过SubSite示例(在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中需要的正确的./或../ 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();
    }

如果需要,您可以通过converter.telerik.com运行该转换为VB.net。我设置我的母版页以使用该函数公开javascript全局变量JSPATHTOSITEROOT,因此我也可以通过JS为我需要的任何路径添加前缀。

对于PHP,我有一段时间没有触及过,所以我能给出的是我发布的其他代码的一些指示,以解决这个问题: http://us2.php.net/manual/en/function.dirname.php#91208

该链接显示了如何使PHP包括嵌套工作,如C / C ++包括嵌套,但您也可以使用相同的技巧来修复html的路径。

我的最终总结是,如果有人向你提供一个带有图像和css路径的项目,所有这些都以“/”开头,那么它们就会通过测试。代码不可移植。 21世纪的优秀Web开发人员知道,可以在服务器根目录或作为子站点部署站点,原因有各种各样的原因和代码。