将URL设置为使用短横线而不是ID的SEO友好标题

11
我正在使用AngularJS创建一篇文章页面,并为每篇文章提供详细信息链接。这些链接是基于ID来确保它们是唯一的,但我想让URL成为标题带破折号的形式(更符合SEO和用户友好度),而不是ID。以下是Angular示例,其中产品详细信息是干净的标题: http://angular.github.io/angular-phonecat/step-11/app/#/phones 我的当前URL是通过ID链接的,因此它们显示为article/66D5069C-DC67-46FC-8A51-1F15A94216D4。
我希望它们显示为文章标题,例如article/start-investing,并确保它们对SEO友好。
我的担忧是,如果两篇由不同作者编写的文章具有相同的标题(例如了解投资),那么如果我尝试按标题链接/查找而不是唯一的ID,就会出现错误。
以下是我的控制器:
var pfcControllers = angular.module('pfcControllers', []);

pfcControllers.controller('pfcCtrl', ['$scope', 'pfcArticles', function ($scope, pfcArticles) {
$scope.articles = pfcArticles.query();
}]);

pfcControllers.controller('pfcCtrl2', ['$scope', '$routeParams', 'pfcArticles', function ($scope, $routeParams, pfcArticles) {
$scope.article = pfcArticles.get({ articleID: $routeParams.articleID });
}]);

这是我的路由器:

var pfcModule = angular.module('pfcModule', ['ngRoute', 'pfcServices', 'pfcControllers']); pfcModule.config(['$routeProvider', function ($routeProvider) { $routeProvider. when('/home', { templateUrl: './views/home.html'}). when('/categories', { templateUrl: './views/categories.html', controller: 'pfcCtrl' }). when('/article/:articleID', { templateUrl: './views/articles.html', controller: 'pfcCtrl2' }). otherwise({ redirectTo: '/home' }); }]);

以下是我的两个partials:
Categories.html(多篇文章)
<div class="row">
<div class="col-md-4">
    <h2>Heading</h2>
    <table class="table table-striped">
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Category ID</th>
            <th>Link</th>
        </tr>
        <tr ng-repeat="article in articles">
            <td>{{article.id}}</td>
            <td>{{article.articletitle}}</td>
            <td>{{article.articlecategoryid}}</td>
            <td><a href="#articles/{{article.id}}">Link</a></td>
        </tr>
    </table>
</div>

文章.html(单篇文章)
<div class="row">
<div class="col-md-4">
    <h2>Heading</h2>
    <table class="table table-striped">
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Category ID</th>
            <th>Summary</th>
        </tr>
        <tr>
            <td>{{article.id}}</td>
            <td>{{article.articletitle}}</td>
            <td>{{article.articlecategoryid}}</td>
            <td>{{article.articlesummary}}</td>
        </tr>
    </table>
</div>

以下是我的JSON输出示例:

[{"id":"66D5069C-DC67-46FC-8A51-1F15A94216D4","articletitle":"Start Investing","articlecategoryid":1,"articlesummary":"Investing is not gambling, but many people treat it with fear, excitement and apprehension like they are playing a game of chance. They act under the assumption that an investor was born with money and understands rules that are not known by anyone else. While it is true that some of the biggest risks hold the largest gains, you can take a controlled and planned approach. There is nothing wrong with a long term reasonable gain on an investment. Question: It seems so complicated, how does someone start investing? Answer: In fact, it is easy start investing, without taking giant risks, and with a plan in place. The key is \"3D Investing\"; Diversify, Dollar Cost Averaging, and Determination. Need motivation? Use The Investing Calculator to determine your future value with compound interest. ","articlelink":"http://www.thebudgetcalculator.com/start-investing.html"},{"id":"4E94D4A5-15A3-4D3D-BAD5-C1E9264145A2","articletitle":"Why Budget","articlecategoryid":2,"articlesummary":"A budget is one of the most overlooked, yet powerful tools in a financial plan. You have to know what you have, what you don't have, and follow a \"road-map\" in order to get where you want to be! If you stick to your budget, it will be the best friend you have, because a lot of financial stress comes from not knowing where your finances are, and not having a plan. In your budget is where you lay out your plan of how your dollars are spent, what debts are being paid down (read about debt), and how much you can save for the future. Question: So why do so few people actually sit down and do a budget? Answer: Many people just don't know where to start. ","articlelink":"http://www.thebudgetcalculator.com/why-budget.html"},{"id":"E1E90A53-1839-4F1E-9C69-EFD1F77DD322","articletitle":"Managing Debt","articlecategoryid":3,"articlesummary":"Debt is both physical and emotional, because it not only affects both all physical finances and value, but also weighs on us through stress and uncertainty. A lot of this uncertainty comes from not knowing where you stand each month, and that is why a budget is so important to determine what you can and cannot spend. But let’s be realistic, at some point in our lives most of us have debt, whether it is in the form of credit cards, student loans, mortgage, etc. Question: So if you have debt, how do you go about paying it off? Answer: There are many approaches to paying down debt, and here are there of them. ","articlelink":"http://www.thebudgetcalculator.com/managing-debt.html"},{"id":"102CC729-465B-4893-8374-0F30AA4FC751","articletitle":"Retirement Planning","articlecategoryid":4,"articlesummary":"The word retirement sounds relaxing, but if you did not save for your golden years you had better start hoping for a miracle. If this statement does not scare you, let’s put it into proper perspective. If you do not save for retirement you will be a burden upon your loved ones, your society, and yourself. This is probably the shortest section on thebudgetcalculator.com because it is the most straightforward. Participate in your company’s retirement plan, or get an IRA (Individual Retirement Account). IRA's are offered at most banks and brokerages. So if your company does not have a retirement plan or you are self-employed, do yourself and the world a favor by starting your retirement savings today! The younger your start, the more you have at retirement, because the money put into an retirement account has more time to gain value before you need the funds.","articlelink":"http://www.thebudgetcalculator.com/retirement-planning.html"},{"id":"03119912-D732-4C68-B41E-F34B28FCD20F","articletitle":"Investing Basics","articlecategoryid":1,"articlesummary":"Learn the investing basics using these resources and start investing today. Whether you are a beginner investor, or seasoned broker, it is always valuable to understand the fundamentals of investing.","articlelink":"http://www.theinvestingcalculator.com/investing-basics.html"}]

我需要进行某种URL重写吗,如果需要,那么在Angular中应该如何进行?还有其他的方式可以使用唯一的ID来链接,或者其他人只是链接到标题?


1
请只返回翻译后的文本:请在“when()”和“otherwise()”中添加“:”和参数名称以设置路由的可选参数。此外,您可以使用Angular的“$location.search”服务将ID设置在URL上。 - SoluableNonagon
var pfcModule = angular.module('pfcModule', ['ngRoute', 'pfcServices', 'pfcControllers']);pfcModule.config(['$routeProvider', function ($routeProvider) { $routeProvider. when('/home', { templateUrl: './views/home.html'}). when('/categories', { templateUrl: './views/categories.html', controller: 'pfcCtrl' }). when('/article/:articleID', { templateUrl: './views/articles.html', controller: 'pfcCtrl2' }). otherwise({ redirectTo: '/home' }); }]); - Kode
看起来 Angular 教程正在使用 id 字段,但实际上值是一个字符串标题。在我看来不是真正的 ID 字段。 - Kode
4个回答

4

我建议在现有路线的基础上添加另一条路线。

  when('/phones/:phoneId', {
    templateUrl: 'partials/phone-detail.html',
    controller: 'PhoneDetailCtrl'
  }).
  when('/phones/:phoneId/:title', {
    templateUrl: 'partials/phone-detail.html',
    controller: 'PhoneDetailCtrl'
  })

针对您的情况,您可以使用以下链接访问同一个页面。

 <a href="http://my.url.com/articles/#66D5069C-DC67-46FC-8A51-1F15A94216D4">Start Investing</a>

 <a href="http://my.url.com/articles/#66D5069C-DC67-46FC-8A51-1F15A94216D4/Start+Investing">Start Investing</a>

第二个将完全与第一个相同。

我该如何在我的控制器中获取多个路由参数?我目前正在使用以下语法: pfcControllers.controller('pfcCtrl2', ['$scope', '$routeParams', 'pfcArticles', function ($scope, $routeParams, pfcArticles) { $scope.article = pfcArticles.get({ articleID: $routeParams.articleID, articleTitle: $routeParams.articleTitle }); }]); - Kode

1
我建议您在URL中使用作者的用户名,这样路由将看起来像:
.when('/article/:userID/:articletitle', { 
    templateUrl: './views/articles.html', 
    controller: 'articleCtrl' 
  })

这将解决不同作者拥有相同文章标题的问题(但如果作者发布两篇标题相同的文章,就会出现问题。为此,您可以在URL中引入年份或月份以使其唯一)。
此外,您可以创建另一个视图,让作者可以查看他们所有的文章(路由将类似于)。
.when('/article/:userID', { 
    templateUrl: './views/allArticles.html', 
    controller: 'allArticleCtrl' 
  })

1
你可以使用以下选项之一,我按照我的偏好对它们进行了排序:
  1. 只使用格式化后的标题作为URL,除非标题之间存在冲突。如果标题发生冲突,则使用以下方法之一来区分它们。您的路由应该是'/articles/:formattedTitle'。如果数据库中有多篇具有相同标题且没有明确指示要选择哪一篇的文章,则选择最早创建的那篇。
  2. 创建一个名为textKey的新字段,并根据文章标题自动填充该字段。例如,一个结果将导致http://my.url.com/articles/start-investing,下一个结果将导致http://my.url.com/articles/start-investing-2。您的路由应该是'/articles/:textKey'
  3. 创建一个名为discriminator的新字段,默认值为Null,仅在标题发生冲突时填充它。例如,一个结果将导致http://my.url.com/articles/start-investing,下一个结果将导致http://my.url.com/articles/start-investing/1。您的路由应该是'/articles/:formattedTitle/:discriminator'
  4. 添加ID和标题,例如,一个结果将导致http://my.url.com/articles/start-investing/66D5069C-DC67-46FC-8A51-1F15A94216D4,下一个结果将导致http://my.url.com/articles/start-investing/AAE5069C-ABCD-46FC-8A51-1F15A94213A5。您的路由应该是'/articles/:formattedTitle/:id'

0

使用js生成页面不太符合SEO标准...另外,为什么你的JSON中有一个"article-link"属性呢?

如果这个链接没有用处,那么你可以直接获取html内容并解析输出以构建你的产品对象。

或者更好的方法是,重新设计你的服务器端实现,因为如果你能够通过GET请求获取到http://www.thebudgetcalculator.com/start-investing.html上的html,那么你应该以同样的方式实现JSON api调用,比如http://www.thebudgetcalculator.com/api/articles/start-investing


文章链接是为了在需要链接到其他信息时使用的URL。我的主要关注点是有两篇由不同作者撰写的相同标题的文章。这就是为什么我倾向于使用ID,因为每个ID都是唯一的。根据您的观点,较小的问题可能是重新设计后端...除非有一种方法可以通过文章标题链接REST调用,其中ID = ID。 - Kode
1
你可以重新设计后端,使得标题为“开始投资”的文章获得类似“start-investing”的URI,如果另一篇具有相同标题的文章出现,则创建一个类似“start-investing-2”的URI。或者,如果这是作者的问题,并且一篇文章由作者拥有唯一的标题/URI,则通过api/author/ugly-article-title进行API调用。 - n00dl3
强有力的想法。我将深入研究如何使用逻辑将所需标题添加到REST调用的发布中。 - Kode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接