可以用'吗/'在相对路径中

Is it Ok to use '../' in relative paths?

本文关键字:相对 路径      更新时间:2023-09-26

我正在使用extjs4构建一个驻留在drupal中的web应用程序
我的许多ajax调用都是针对drupal中某个模块中的菜单项的
css指向的图像有时位于extjs文件夹中,有时位于drupal中。

一位同事坚持认为使用…的相对路径/dira/是一种糟糕的设计,并且容易产生风险。

这是正确的吗?还有别的办法吗?

我的文件夹结构:

- drupal
   - v2 (extjs home folder)
      - css
      - extjs
   - sites
      - mySite
          - modules
              - webApp

我的css文件包含如下调用:

.x-action-col-cell img.restart-test-icon {
    background-image: url(../extjs/examples/sandbox/images/gears.png);
}

我的应用程序有这样的调用:

Ext.Ajax.request({
   url: '../webapp/tests/create/',
   method: 'Post'
});

编辑:评论员要求澄清。同事的两个主要问题是:
1."如果服务器端代码将生成一个类似/a/b/c的地址,而没有后面的/,则可能会出现/a/b/c../d"
是吗?这听起来更像是服务器端的问题
2."你见过其他人使用它吗?"
在我看来,这是一种非常糟糕的决定方式
但我继续使用firebug测试了一些JS密集型网站(gmail、aws),发现它们的JS或CSS中没有使用../
有人能帮我证明我的说法吗?

a。"如果服务器端代码将生成一个类似/a/b/c的地址,而没有尾随/,那么您可能会遇到这样的情况:/a/b/c/d"是吗?这听起来更像是服务器端的问题。

如果你的文件中配置好了路径,我想不出有什么问题。

b。"你见过其他人使用它吗?"在我看来,这是一种非常糟糕的决定方式。

这确实是一种糟糕的方式。我尝试了第一个可用的网站(stackoverflow.com),请参阅此页面中包含的all.css:

.review-diff-bar .review-diff-bar-helper {
    background: url("../Img/diff-icons/full-html-diff.png") no-repeat scroll 0 0 transparent;
    ...
}
.openid-identifier {
    background: url("../img/openid-large.png") no-repeat scroll left center transparent;
    ...
}

这是一个css,但同样适用于js文件。

(1) 关于这类谬论的信息:http://www.fallacyfiles.org/ignorant.html

这是一个相当糟糕的论点,类似于说:

如果你不净化数据库输入,你可能会受到SQL注入攻击,因此,我不会使用数据库。

这是几乎相同的情况,一个净化输入的问题。

你使用的任何服务器端堆栈都很可能内置了处理这些事情的功能(或库),类似于C#中的Path类:http://msdn.microsoft.com/en-us/library/3bdzys9w(v=vs.71)

如果服务器端代码将生成一个类似/a/b/c的地址,而没有a尾随/你可能会遇到/a/b/c的情况/d

这不是它的工作方式。如果你在/a/b/c并引用../d,浏览器会请求/a/b/d,因为c不是目录,而/a/b/是。现在,如果你只是连接字符串,我可能会看到问题(注意,很多语言都有组装路径的功能)。这不一定是的风险,您最终只是要求提供错误的文件。

现在,我看到一些非常愚蠢的爬虫通过我的网站,试图使用与base标签相结合的相对URL,结果在我的日志中出现了数千个404。。。因为他们没有考虑到这样一个事实,即我的所有相对链接都是用我的基本标记的href来准备的。在不使用基本标签的情况下,我没有遇到任何问题(我不主张相对还是绝对)。

不使用相对路径的主要问题是,引用其他文件(例如css、html和js文件)的文件的每次移动都需要更改该文件中的引用。

此外,如果你有一个html源代码的javascript,而另一个javascript源代码的css文件,那么开发人员通常不清楚相对路径是什么(开发人员在这个区域犯错误是很常见的,是包含html路径还是引用的调用方路径?)

此外,正如一条评论中所提到的,这种做法导致在服务器端级别使用相同的模式,在某些情况下,这可能会导致轻微的安全风险。

使用相对url的主要原因是,它允许您将整个项目从一个目录移动到另一个目录,而无需更改任何内容。如果您使用的是相对根URL,则无法做到这一点。

总而言之,这个决定实际上取决于个人和项目。我通常更喜欢根相对URL,但我也有过相对URL。

顺便说一句,最好的办法是有一个服务器端或编译时间变量,你可以把它用作根,这给你带来了稳定性和灵活性,但通常这是很少有人拥有的奢侈。