1

我正在设计一个 web 应用程序,其中我的资源位于http://www.site.com/resources/目录中

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

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

我还有哪些其他选择?

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

提前致谢!

4

1 回答 1

4

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

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

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

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

因此,设置图像的 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 中需要的正确 ./ 或 ../ 斜线,如下所示:

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 开发人员知道,出于各种原因和适当的代码,站点可能会部署在服务器根目录或作为子站点。

于 2012-06-20T22:06:59.587 回答