在 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¶m2=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 中使用双斜杠有啥缺点吗?的主要内容,如果未能解决你的问题,请参考以下文章