背景:我正在Symfony2中构建一个网站的博客部分。
问题:在新闻中链接特定评论的最佳方式是什么?我应该如何定义路由结构?
例子:
单一新闻网址:
example.com/news/{news_id}
单条新闻+评论Url:
example.com/news/{news_id}/comment/{comment_id}
or
example.com/news/{news_id}#comment-{comment_id}
or
example.com/news/{news_id}?comment={comment_id}
这些只是一些建议…
非常重要:
我需要在控制器中同时使用news_id和comment_id。它们需要是可检索/可用的
建议链接的结构将有不同的结果,并且您的comment_id变量在所有情况下都不会对您的脚本可用。
对新闻页面很重要的东西,它们对SEO的影响不同。
url的前两个变体
example.com/news/{news_id}/评论/{comment_id}
example.com/news/{news_id} ?评论= {comment_id}
-
commment_id
将在您的脚本中可用。Symfony将传递给您的控制器,或者您可以从Request对象(或从$_GET变量-但不要这样做)获取它。 - 浏览器 将不
- 不用担心,如果你不为同一个页面创建两个路由,就不会有重复的内容。
- 从SEO的角度来看,你正在为每个评论创建一个单独的页面(我知道你不是),这就是谷歌将从url结构中提取的方式。要避免重复内容,只需在HEAD中添加规范链接元素,以指向根url
<link rel="canonical" href="example.com/news/{news_id}" />
标签url变量
example.com/news/{news_id} #评论- {comment_id}
-
comment_id
将不在您的脚本中可用。#
之后的所有内容都由浏览器直接处理,它根本不会将其发送到服务器。comment_id值将仍然可以通过javascript(这就是stackoverflow如何做到这一点) -
浏览器
将尝试移动(滚动)到html的一部分,其中
#
之后的键被用作ID..如。<div id="comment_id-123">
。如果你的标记中没有这个ID元素,它会留在最上面。
基于您不希望为每个评论单独的页面的假设,并且您只需要comment_id用于注释的分页。
正确的解决方案是使用URL的#变体。
- 只加载news_id 的页面
- 页面加载后,做一个ajax调用与comment_id参数的评论,或第一页,如果没有参数。
- 用返回的关于页面等的信息更改评论部分
- 添加加载器图像,这样用户就会知道发生了什么,因为这增加了用户体验。
更适合SEO的选择
如果你想要更好的SEO,更合适的url不是有id,而是有slugs,也没有不必要的单词。我个人的建议是:
example.com/n/{news_slug}#{comment_title_slug}-{comment_id}
// would become something like1
example.com/n/answer-to-life-is-awesome#yeah-it-was-a-great-book-5435335435
如果可以处理解析和db查询,也可以不使用/n前缀。
标题>你混合了两个不同的概念:
<标题> 链接下面两个链接带有相同的参数,新闻和评论id:
example.com/news/{news_id}/comment/{comment_id}
or
example.com/news/{news_id}?comment={comment_id}
浏览器打开这些url 将不会滚动页面。
带锚的链接
下面的链接只有一个参数,新闻id,并且它使用一个锚:
example.com/news/{news_id}#comment-{comment_id}
打开该URL的浏览器将滚动到锚。
所以这取决于你的需要,如果你想让访问者的浏览器滚动到评论,使用锚(Javascript也可以)。
以下是有效的锚:
<div id="comment-42">...</div>
or
<p><a href="#" name="comment-42">...</a></p>
这里有一个指向这个答案的链接:https://stackoverflow.com/questions/33176341/php-url-structure-to-link-specific-comment/33179630#33179630
参见#!
url。
我认为更好的方法是使用#comment-{comment_id},因为其他2个url可能导致重复的url问题。