在 URL 中使用双斜杠有啥缺点吗?

Posted

技术标签:

【中文标题】在 URL 中使用双斜杠有啥缺点吗?【英文标题】:Are there any downsides to using double-slashes in URLs?在 URL 中使用双斜杠有什么缺点吗? 【发布时间】:2012-06-30 15:42:57 【问题描述】:

我用 php 编写了自己的 MVC 框架,它使用以下格式的 url:

/controller/method/param1/param2/param...

我已经做到了,“默认”方法可以被忽略(默认为index()),所以这会产生像/controller//param1/param2/param... 这样的URL。例如,/view//panel-glide/3 的 URL 将在 view 控制器中调用 index('panel-glide', 3)

这很好用,但我担心搜索引擎或某些较旧的浏览器在看到双斜杠时可能会吓坏,因为我认为我以前从未真正使用过它们。

有人知道我使用这个可能会遇到什么问题吗?

【问题讨论】:

附注:为什么不强制执行控制器/方法的刚性结构?param1=value1&param2=value2...?对我来说似乎更像 RPC。 @LiorCohen Drupal 例如接受您建议的格式,但将 url 重写为 OP 的格式。有可能他只是忽略了这是在幕后进行的。 我主要关心的是灵活性而不是严格的结构执行。我的输入类仍然可以访问查询字符串参数(例如$this->input->get('param')`将返回value1)。我想允许将 URI 段解析为方法参数(如在 CodeIgniter 中)以便于使用和更好的 url(如/blog/post/hello-world-foo-bar-baz 搜索引擎问题:Apache Solr 的 JSON 解析器无法处理双斜杠;他们将 cmets 添加到 JSON 语法的扩展被破坏,斜杠将注释掉字符串的右引号 @Potatoswatter 我认为您应该将其发布为答案。 【参考方案1】:

WebMasters 上有一个讨论dangers of having two slashes 的现有答案。它讨论了很多 Apache,但这些想法应该是普遍适用的。

本质上,我认为不推荐。 /foo/bar/foo//bar 确实应该是两条完全不同的路径。每个斜线都很重要,规避标准化的尝试必然会反噬你。

正如答案中提到的,相对路径失败也存在非常真实的危险。一些浏览器会正确认为../../fizz/foo/bar//baz 之间的相对路径是/foo/bar/fizz,而另一些浏览器会将双斜杠视为单个,并选择/foo/fizz

另外,我觉得它看起来很有趣。

【讨论】:

我同意。作为开发人员,它看起来很有趣。作为用户,它看起来很有趣。实际上,如果我将该网址添加为书签并且链接已损坏,我希望删除额外的 / 来修复它。而且,对代码进行更改可能会实现这一点。 @nomaD 把多余的 / 改写出来。 就我而言,/foo/bar/foo//bar 是两条完全不同的路径。 /foo/bar 将加载foo 控制器的bar() 方法/动作,/foo//bar 将加载foo 控制器的index('bar') @nomaD:它不仅仅是美学。请参阅我的编辑。您是否有不想将 /foo/index 设为显式 URL 的原因? @nomaD:所以,实际上,你可能不想想试试。 :]【参考方案2】:

Apache 将多个斜杠视为一个斜杠。这会影响诸如RewriteRules 之类的东西,例如如果你有这样的规则:

RewriteRule ^user/(.*)/([0-9]+)$ /user.php?id=$2 [QSA,L]

这将捕获诸如user/nomaD/500之类的链接,但它不会捕获user//500,因为它将其视为user/500

换句话说,我认为您的设置不会起作用,因为它将param1 视为method 并将所有参数左移,除非它们属于特定类型。我想这不会影响您的具体情况,但在很多情况下,这将是使用 // 的缺点。

【讨论】:

但他说它确实有效。我猜他不可能在 apache 上,你们俩都是对的。 我的设置确实有效,我正在使用包罗万象的重写:RewriteRule ^(.*)$ index.php?$1 [L],然后使用 PHP 解析 url 并找出要加载的内容 也许他正在分解REQUEST_URI 以分离出参数 绝妙的洞察力。不过很有道理。 PHP 不在乎 apache 对双斜杠的看法。 是的,我正在使用 PHP 通过'/' 分解 URL,$segment[0] 是要加载的控制器,segment[1] 是方法/操作(以及 if ($segment[1] == '') $segment[1] = 'index';,以及以下所有内容段被用作该方法的参数。所以/blog//first-post 将基本上运行$framework->blog->index('first-post')/blog/first-post 将运行$framework->blog->first-post() 这不会完全工作;)

以上是关于在 URL 中使用双斜杠有啥缺点吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中使用匿名函数有啥缺点吗?例如。内存使用?

在数据仓库场景中使用 WITH(NOLOCK) 有啥缺点吗

url后面带斜杠与不带斜杠有啥区别吗?

如果我使用 Array 而不是 Vector,有啥缺点吗?

将存储过程与 Dapper 一起使用有啥缺点吗?

冗余限定符有啥缺点吗?有啥好处吗?