我正在使用extjs4构建一个驻留在drupal中的webapp 我的许多ajax调用都是drupal中模块中的菜单项 我的css指向的图像有时会驻留在我的extjs文件夹中,有时也会出现在drupal中。
同事坚持认为使用'../dir_a/'的相对路径设计不好,并且容易冒险。
这是对的吗? 还有另一种方式吗?
我的文件夹结构:
- 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
”的情况
的真的吗?这听起来更像是服务器方面的问题。
“你见过其他人使用它吗?”
在我看来,这是一种非常糟糕的决定方式。
但我继续使用firebug测试了一些JS密集型站点(gmail,aws),发现他们的JS或CSS没有使用../
。
任何人都可以帮我支持我的说法完全没问题吗?
答案 0 :(得分:1)
这是一个非常糟糕的论点,它类似于说:
如果您没有清理数据库输入,则可能容易受到SQL注入攻击,因此,我不会使用数据库。
这几乎是一个相同的案例,就是对你的投入进行消毒。
很可能你使用的服务器端堆栈内置了功能(或库)来处理这些事情,类似于C#中的Path类:http://msdn.microsoft.com/en-us/library/3bdzys9w(v=vs.71)
答案 1 :(得分:1)
一个。 “如果服务器端代码生成一个像/ a / b / c这样的地址而没有尾随/你可能会遇到这种情况 /a/b/c../d“是的?这听起来更像服务器方面的问题。
如果文件中的路径配置得很好,我想不出任何问题。
湾“你见过其他人使用它吗?”在我看来,这是一种非常糟糕的决定方式。
这是一种糟糕的方式,确实(1)。我尝试了第一个可用的网站(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
答案 2 :(得分:1)
如果服务器端代码将生成/ a / b / c之类的地址 尾随/您可能会遇到/ a / b / c ../ d
的情况
这不是它的工作原理。如果您位于/a/b/c
并且引用../d
,则浏览器会请求/a/b/d
,因为c
不是目录,/a/b/
是。{1}}。现在,如果您只是连接字符串,我可以看到存在问题(请注意,许多语言都具有组装路径的功能)。这不一定是风险,你最终会要求提供错误的文件。
现在我看到一些非常愚蠢的抓取工具来自我的网站,同时尝试使用相对网址与base
标记相结合,并在我的日志中结束了数千个404 ...因为他们没有考虑到考虑到我的所有相关链接都是以我的基本标签的href为前缀的事实。没有使用基本标签,我没有遇到任何问题(我不提倡相对于绝对的方式)。
答案 3 :(得分:0)
不使用相对路径的主要问题是,引用其他文件(例如您的css,html和js文件)的文件的每次移动都需要您更改此中的引用文件。
另外,如果你有一个html来源javascript来源另一个源css文件的javascript,那么开发人员通常不清楚相对路径是什么(开发人员在这个区域犯错是很常见的 - 是它包含HTML路径或引用的调用者路径?)
此外,正如一条评论中所提到的,这种做法导致在服务器端级别使用相同的模式,这在某些情况下可能会造成轻微的安全风险。
使用相对网址的主要原因是它允许您将整个项目从一个目录移动到另一个目录,而无需更改任何内容。如果您使用root-relative网址,则无法执行此操作。
总而言之,这个决定实际上是个人和项目依赖的。我通常更喜欢root-relative网址,但我也只是相对网址。
顺便说一下,最好的方法是拥有一个可以作为root用户使用的服务器端或编译时变量,它可以提供稳定性和灵活性,但通常这是一种很少有人拥有的奢侈品