Eri*_*rik 8 seo slug mongoose mongodb node.js
我使用MongoDB/mongoose存储具有以下模式的博客帖子:
PostSchema = mongoose.Schema({
title: {type: String},
body: {type: String}
});
Run Code Online (Sandbox Code Playgroud)
现在我的帖子网址如下所示: http://www.example.local/posts/571f78d077b4454bafcfcced
我希望我的帖子包含如下的slug:
http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make-and-store-slug-for-title
所以我的问题是:
http://www.example.local/posts/571f78d077b4454bafcfcced到http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make-and-store-slug-for-title(nodejs,nginx,客户端).谢谢!
EIDT:我还发现在StackOverflow数据库viwer中用于id为503429的qoestion存储非slugged标题.那么,每当问题被要求时,SO是否计算出slu?
1.我应该生成一次slug并存储在PostModel模式中还是生成每个帖子显示?
这两种方法都有效且有优点:
在这两种情况下,您都必须选择一个模式并定义一个算法来生成与您选择的模式匹配的slug.
我个人几乎总是选择在数据库中存储slug,它允许你为特定的帖子指定一个slug.你可能永远不需要这样做,但如果案件出现,你就准备好了.例如,如果对于特定的帖子,生成的slug将是awesome-post并且你想要它best-awesome-post,如果slug存储在数据库中你可以很容易地做到,否则你将不得不为每个"特殊"情况调整你的算法,这将成为一个像这样的多个案件的噩梦.
我认为有利于存储它的另一点:一旦你发布帖子,slug就是这篇文章的永久链接的一部分,它应该被认为是不可改变的.如果我能在这种情况下避免它,我不是很多次生成不可变数据的狂热粉丝.
2.如何根据标题(现有节点模块解决此任务)生成非ASCII字符的slug?
就像你说的,存在多个节点模块来生成基于一个或多个字段(如标题)的slugs,有些甚至与MongoDB/Mongoose集成,如mongoose-url-slugs.
在大多数slu,中,重音字符将被转换为非重音符号,一切都被转换为小写,删除标点符号-,例如用空格等替换空格.
关于你问题的ASCII部分,如果你看一下例如mongoose -url-slugs的代码,当生成一个slug时,他们调用一个removeDiacritics函数,它将剥离这些特殊字符并用一个slug友好的等价替换它们.
我能想到的一个例子是需要特殊处理才能正确处理德语中的"道路"一词:"Straße".
该函数将识别Eszett字符(\u00DF)并将其替换为字母's'.
如果你想领先一步,你应该使用一个slug模块处理unicode和utf-8像slug,例如符合关于统一资源标识符(URI)的RFC 3986.
它会改变一个标题一样i ? my title,以i-love-my-title等
3.我应该使用哪个地方将查询重定向http://www.example.local/posts/571f78d077b4454bafcfcced到http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make-and-store-slug-for-title(nodejs,nginx,客户端).
如果你因为我上面发布的原因在你的数据库中存储slug,那么slug应该只生成一次然后保存在数据库中.此时,服务器端或客户端不再需要再生.
在客户端显示链接时,您将始终安全地使用先前生成的slug,例如http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make-and-store-slug-for-title,显示符合所需模式的链接.
如果客户端使用没有slug或部分slug的url http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make,重新定向到带有完整slug的正确url,在这个特定问题的Stack Overflow就是一个很好的例子,他们只是将301重定向发送到正确的url .
他们应该在服务器上处理这些特殊情况,因为您在服务器上的应用程序是唯一一个(如果您在数据库中保存slug)具有此权限的权限.您的应用程序知道特定帖子的正确slug,因为它在数据库中,因此如果未指定slug或仅部分(在应用程序中易于检测),您可以安全地触发301重定向到正确的URL并使用正确的URL slu ,,就像http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make-and-store-slug-for-title.
您应该在Node应用程序中处理这些情况(我假设您正在使用问题中提到的Node)并在需要时重定向到正确的URL.
例如:
res.writeHead(301, { "Location": `http://www.example.local/posts/${postId}/${postSlug}` });
Run Code Online (Sandbox Code Playgroud)
由于可以通过多个URL访问类似的内容,因此您还应该使用规范链接元素来指定搜索引擎应该使用的"规范"URL,以避免重复的内容问题.
<link rel="canonical" href="http://www.example.local/posts/571f78d077b4454bafcfcced/how-to-make-and-store-slug-for-title">
Run Code Online (Sandbox Code Playgroud)
关于您对Stack Exchange Data Explorer的编辑,我认为他们从结果中省略了该字段,因为它并不是那么重要.根据Stack Exchange的软件开发人员和系统管理员Nick Craver的评论,他们确实在检查他们在数据库中的标题是否与查询中的标题匹配,如果没有,则重定向.
关于URL中的俄语字符的编辑:
例如,如果你想保留俄语字符,没问题,只要你跟上utf-8.您的链接示例显示俄语字符,但在场景后面的URL是"百分比编码"或"网址编码",您可以通过右键单击浏览器中的链接自行查看,选择Inspect,您将看到该URL实际上是这样的http://ru.stackoverflow.com/questions/456697/genymotion-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0.您的浏览器知道它是url编码的,并且正确显示俄语字符.
您当然有Node.js模块甚至是本机Javascript方法来对您想要的任何URL进行url编码.
如果你也想知道搜索引擎优化和搜索引擎,谷歌例如:"我们通常可以跟上UTF-8编码的网址,我们通常会在搜索结果中向用户显示这些网址(但是通过网址链接到您的服务器)适当逃脱)"所以没有问题.
大多数"slugifier"模块将删除这些字符,所以如果你真的想保留它们,你将不得不使用更具体的东西,如arSlugify:
var ars = require('arslugify');
var title = 'genymotion ?????? ??? ???????? ???????????? ??????????';
var slug = ars(title);
var url = 'www.example.local/posts/571f78d077b4454bafcfcced/' + slug;
var encodedUrl = encodeURIComponent(url);
console.log(url);
// www.example.local/posts/571f78d077b4454bafcfcced/genymotion-??????-???-????????-????????????-??????????
console.log(encodedUrl);
// www.example.local%2Fposts%2F571f78d077b4454bafcfcced%2Fgenymotion-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2577 次 |
| 最近记录: |