Easy Sitemap

Easy Sitemap

Ich habe in letzter Zeit ein wenig über SEO gelesen und gelernt. Eine einfache Sache ist es, eine Sitemap zu erstellen und sie in Googles Search Console einzureichen. Hier ist, wie man das mit Rails macht.
Eine einfache Möglichkeit, Ihr SEO zu verbessern, besteht darin, Google darüber zu informieren, was verfügbar ist. Sicherlich durchsuchen sie Ihre Seite automatisch, aber nichts ist perfekt. Der einfachste Weg, ihnen die benötigten Informationen zu geben, besteht darin, Sitemaps zu erstellen und sie beim Google Search Console-Tool einzureichen.

Beispiel App

Erstellen einer Beispiel App:
$ rails new SitemapApp
$ cd SitemapApp
BasisCoder erstellen wie auf Seite 15-basis-code .

Erstellen von Seiten und Artikel

Wir erstellen nun ein paar statische Seiten und Artikel die flexible sind.
$ rails g controller Pages index agb impressum dateschutz
$ rails g scaffold Articles name content:text
$ rails db:migrate

Routing optimieren

Ein paar Einstellungen in der Datei routes.rb:
// config/routes.rb

Rails.application.routes.draw do
  resources :articles
  get 'agb' => 'pages#agb'
  get 'impressum' => 'pages#impressum'
  get 'datenschutz' => 'pages#dateschutz'
  root 'pages#index'
end
  • Rails.application.routes.draw do: Dieser Block definiert die Routen für die Anwendung.
  • resources :articles: Dies definiert standardmäßige RESTful-Routen für die Ressource "articles", was bedeutet, dass Routen für die CRUD-Operationen (Create, Read, Update, Delete) automatisch erstellt werden.
  • get 'agb' => 'pages#agb': Dies definiert eine benutzerdefinierte Route für die URL "/agb", die auf die Methode "agb" im Controller "pages" verweist.
  • get 'impressum' => 'pages#impressum': Ähnlich wie oben definiert diese Zeile eine benutzerdefinierte Route für die URL "/impressum", die auf die Methode "impressum" im Controller "pages" verweist.
  • get 'datenschutz' => 'pages#datenschutz': Dies definiert eine benutzerdefinierte Route für die URL "/datenschutz", die auf die Methode "datenschutz" im Controller "pages" verweist.
  • root 'pages#index': Diese Zeile definiert die Wurzelroute der Anwendung, also die URL, die aufgerufen wird, wenn Benutzer die Basis-URL der Anwendung besuchen. Hier wird sie auf die Methode "index" im Controller "pages" geroutet.

Statische Seiten

Die statischen Seiten (agb, impressum, datenschutz) mit Lorem Ipsum zu füllen und ihnen eine lebendige Note zu verleihen. 
Die index Seite füllen wir mit den Artikeln.
// app/views/pages/index.html.erb

<h1>Pages#index</h1>
<h2>Articles</h2>

<div id="articles">
  <% @articles.each do |article| %>
  <%= render article %>
  <p>
    <%= link_to "Show this article", article %>
  </p>
  <% end %>
</div>

Pages Controller

Wir müssen noch den controller optimieren:
// app/controllers/pages_controller.rb

class PagesController < ApplicationController
  def index
    @articles = Article.all
  end

  def agb; end

  def impressum; end

  def dateschutz; end
end
  • class PagesController < ApplicationController: Diese Zeile definiert die Klasse "PagesController", die von der Klasse "ApplicationController" erbt. Der ApplicationController ist eine zentrale Klasse in Rails, von der alle anderen Controller erben, und enthält häufig verwendete Funktionalitäten und Konfigurationen für die gesamte Anwendung.
  • def index: Diese Methode wird aufgerufen, wenn die Anfrage an die URL root gesendet wird. Innerhalb dieser Methode wird eine Instanzvariable @articles erstellt, die alle Artikel aus der Datenbank abruft und sie für die Verwendung in der zugehörigen View verfügbar macht.
  • def agb; end: Diese Methode wird aufgerufen, wenn die Anfrage an die URL "/agb" gesendet wird. Diese Methode hat keinen Inhalt, da es sich wahrscheinlich um eine statische Seite handelt, für die keine zusätzlichen Aktionen erforderlich sind.
  • def impressum; end: Ähnlich wie oben wird diese Methode aufgerufen, wenn die Anfrage an die URL "/impressum" gesendet wird. Auch hier handelt es sich wahrscheinlich um eine statische Seite.
  • def dateschutz; end: Diese Methode wird aufgerufen, wenn die Anfrage an die URL "/dateschutz" gesendet wird. Auch hier handelt es sich wahrscheinlich um eine statische Seite.

Artikel Model lesbare ID's

Damit wir später schönere ID's von den Artikeln haben, ändern wir noch das Artikel Model. Eine ausführliche Methode könnt ihr bei friendly-id sehen.
// app/models/article.rb

class Article < ApplicationRecord
  def to_param
    "#{id} #{name}".parameterize
  end
end

Sitemap Controller erstellen:

Der einfachste Weg, um mit Sitemaps in Rails zu beginnen, besteht darin, einen Sitemaps-Controller zu erstellen. Zu Beginn wird er drei Methoden haben, aber bei Bedarf kann er im Laufe der Zeit leicht erweitert werden.
$ rails g controller Sitemaps

// app/controllers/sitemaps_controller.rb

class SitemapsController < ApplicationController
  layout nil

  def index
    respond_to do |format|
      format.xml
    end
  end

  def pages
    @pages = [root_url, agb_url, datenschutz_url, impressum_url]
    respond_to do |format|
      format.xml
    end
  end

  def articles
    @articles = Article.all
    respond_to do |format|
      format.xml
    end
  end
end
  1. layout nil: Diese Zeile deaktiviert das Layout für alle Aktionen innerhalb des Controllers. Das bedeutet, dass die Views ohne das standardmäßige Layout gerendert werden, was in diesem Fall für die Sitemap wahrscheinlich angemessen ist, da Sitemaps normalerweise keine komplexe Formatierung benötigen.
  2. def index: Diese Methode wird aufgerufen, wenn die Anfrage an die URL "/sitemaps/index" gesendet wird. Sie reagiert nur auf XML-Format und wird wahrscheinlich für die Haupt-Sitemap verwendet.
  3. def pages: Diese Methode wird aufgerufen, wenn die Anfrage an die URL "/sitemaps/pages" gesendet wird. Sie stellt eine Liste der URLs für statische Seiten wie die Startseite, die AGB-Seite, die Datenschutz-Seite und die Impressum-Seite bereit.
  4. def articles: Diese Methode wird aufgerufen, wenn die Anfrage an die URL "/sitemaps/articles" gesendet wird. Sie ruft alle Artikel aus der Datenbank ab und stellt sie für die Sitemap bereit.

In allen drei Methoden wird auf die Anfrage mit XML geantwortet, was darauf hinweist, dass die Views wahrscheinlich XML-Daten für die Sitemap generieren. Der Controller ermöglicht somit die Erstellung einer Sitemap für die Website, die sowohl statische Seiten als auch dynamische Artikel einschließt.

Erstellen der builder

Manuell erstellen wir index.xml.builder, pages.xml.builder, articles.xml.builder in dem Ordner views/sitemaps
// app/views/sitemaps/index.xml.builder

xml.instruct!
xml.sitemapindex xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9' do
  xml.sitemap do
    xml.loc sitemap_pages_url
    xml.lastmod Time.utc(2024, 2, 21).strftime('%F')
  end
  xml.sitemap do
    xml.loc sitemap_articles_url
    xml.lastmod Time.current.strftime('%Y-%m-%dT%H:%M:%S+00:00')
  end
end
  1. xml.instruct!(:xml, version: '1.0', encoding: 'UTF-8'): Diese Zeile gibt an, dass es sich um ein XML-Dokument mit Version 1.0 und UTF-8-Encoding handelt. Dies wird als Kopfzeile im XML-Dokument verwendet.
  2. xml.sitemapindex xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9' do: Dies definiert das Wurzelelement <sitemapindex> für die Sitemapindex-Datei und gibt auch den XML-Namespace an.
  3. Innerhalb des <sitemapindex>-Elements werden zwei <sitemap>-Elemente definiert, die jeweils eine separate Sitemap repräsentieren.
  4. Für jede Sitemap wird Folgendes definiert:
    • xml.sitemap do: Dies definiert ein <sitemap>-Element.
    • xml.loc sitemap_pages_url bzw. xml.loc sitemap_articles_url: Dies definiert die URL der jeweiligen Sitemap. Diese URLs könnten auf separate Controller-Actions verweisen, die die generierten XML-Daten für die Sitemaps bereitstellen.
    • xml.lastmod Time.current.strftime('%Y-%m-%dT%H:%M:%S+00:00'): Dies gibt das Datum und die Uhrzeit der letzten Änderung der Sitemap an. In diesem Fall wird die aktuelle Zeit verwendet und im UTC-Format formatiert.

// app/views/sitemaps/pages.xml.builder

xml.instruct!
xml.tag! 'urlset',
         'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
         'xmlns': 'http://www.sitemaps.org/schemas/sitemap/0.9',
         'xmlns:image': 'http://www.google.com/schemas/sitemap-image/1.1',
         'xmlns:video': 'http://www.google.com/schemas/sitemap-video/1.1',
         'xmlns:news': 'http://www.google.com/schemas/sitemap-news/0.9',
         'xmlns:mobile': 'http://www.google.com/schemas/sitemap-mobile/1.0',
         'xmlns:pagemap': 'http://www.google.com/schemas/sitemap-pagemap/1.0',
         'xmlns:xhtml': 'http://www.w3.org/1999/xhtml',
         'xsi:schemaLocation': 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' do
  @pages.each do |page|
    xml.url do
      xml.loc page
      xml.lastmod Time.utc(2024, 2, 21).strftime('%F')
      xml.changefreq 'never'
    end
  end
end
  1. ml.instruct!(:xml, version: '1.0', encoding: 'UTF-8'): Diese Zeile gibt an, dass es sich um ein XML-Dokument mit Version 1.0 und UTF-8-Encoding handelt. Dies wird als Kopfzeile im XML-Dokument verwendet.
  2. xml.tag! 'urlset', ...: Dies definiert das Wurzelelement <urlset> für die Sitemap-Datei und gibt auch verschiedene XML-Namespaces an, die für spezielle Arten von Inhalten wie Bilder, Videos, Nachrichten, mobile Inhalte und Seitenkartierung verwendet werden.
  3. Innerhalb des <urlset>-Elements werden die spezifischen URLs für die Sitemap definiert, die durch die Variable @pages dargestellt werden. Für jede Seite in @pages wird Folgendes definiert:
    • xml.url do: Dies definiert ein <url>-Element.
    • xml.loc page: Dies gibt die URL der Seite an.
    • xml.changefreq 'never': Dies gibt die Änderungshäufigkeit der Seite an. In diesem Fall wird "never" verwendet, was bedeutet, dass sich die Seite nie ändert.

Die XML-Attribute und -Elemente, die in diesem Code definiert sind, entsprechen den Spezifikationen von Google Sitemaps und geben den Suchmaschinen Anweisungen zum Crawlen und Indizieren der Website.
// app/views/sitemaps/articles.xml.builder

xml.instruct!
xml.tag! 'urlset',
         'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
         'xmlns': 'http://www.sitemaps.org/schemas/sitemap/0.9',
         'xmlns:image': 'http://www.google.com/schemas/sitemap-image/1.1',
         'xmlns:video': 'http://www.google.com/schemas/sitemap-video/1.1',
         'xmlns:news': 'http://www.google.com/schemas/sitemap-news/0.9',
         'xmlns:mobile': 'http://www.google.com/schemas/sitemap-mobile/1.0',
         'xmlns:pagemap': 'http://www.google.com/schemas/sitemap-pagemap/1.0',
         'xmlns:xhtml': 'http://www.w3.org/1999/xhtml',
         'xsi:schemaLocation': 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' do
  @articles.each do |article|
    xml.url do
      xml.loc article_url(article)
      xml.lastmod tutorial.updated_at.strftime('%Y-%m-%dT%H:%M:%S+00:00')
      xml.changefreq 'always'
    end
  end
end
  1. Die Schleife @articles.each iteriert über eine Sammlung von Artikeln (@articles), im Gegensatz zur vorherigen Schleife, die über eine Sammlung von Seiten (@pages) iteriert.
  2. xml.loc article_url(article): Hier wird die URL jedes Artikels mit der Hilfsmethode article_url generiert, die die URL für einen bestimmten Artikel basierend auf dessen ID und Namen zurückgibt.
  3. xml.lastmod tutorial.updated_at.strftime('%F'): Dieses Element gibt das Datum der letzten Änderung des Artikels an, das wahrscheinlich aus dem Attribut updated_at des Artikels abgeleitet wird und im Format "%F" (Jahr-Monat-Tag) formatiert wird.
  4. xml.changefreq 'always': Hier wird angegeben, dass sich der Inhalt des Artikels immer ändert, im Gegensatz zur vorherigen Sitemap, wo die Änderungsfrequenz auf "nie" festgelegt war.

Sitemaps Routen

Der letzte Schritt, um Ihre Sitemaps zum Laufen zu bringen, sind ein paar Routen:
// config/routes.rb

  get '/sitemap.xml' => 'sitemaps#index', format: 'xml', as: :sitemap
  get '/sitemap-pages.xml' => 'sitemaps#pages', format: 'xml', as: :sitemap_pages
  get '/sitemap-articles.xml' => 'sitemaps#articles', format: 'xml', as: :sitemap_articles
  1. get '/sitemap.xml' => 'sitemaps#index', format: 'xml', as: :sitemap: Diese Route definiert den Pfad "/sitemap.xml" für die Haupt-Sitemap und verweist auf die Aktion "index" im Controller "sitemaps". Die Option format: 'xml' stellt sicher, dass die Anfrage nur XML-Format akzeptiert, und as: :sitemap definiert einen benannten Pfad, der später in der Anwendung verwendet werden kann.
  2. get '/sitemap-pages.xml' => 'sitemaps#pages', format: 'xml', as: :sitemap_pages: Diese Route definiert den Pfad "/sitemap-pages.xml" für die Sitemap der Seiten und verweist auf die Aktion "pages" im Controller "sitemaps". Ähnlich wie oben akzeptiert diese Route nur XML-Format und definiert auch einen benannten Pfad (as: :sitemap_pages).
  3. get '/sitemap-articles.xml' => 'sitemaps#articles', format: 'xml', as: :sitemap_articles: Diese Route definiert den Pfad "/sitemap-articles.xml" für die Sitemap der Artikel und verweist auf die Aktion "articles" im Controller "sitemaps". Auch hier akzeptiert die Route nur XML-Format und definiert einen benannten Pfad (as: :sitemap_articles).

Insgesamt ermöglichen diese Routen den Zugriff auf die verschiedenen Sitemaps, die im SitemapsController definiert wurden, indem sie spezifische Pfade für jede Art von Sitemap festlegen.

Übermittlung an die Google Search Console

https://search.google.com/search-console

Vergessen Sie nicht andere Robots

Nachdem Sie diese bei Google eingereicht haben, ist der letzte Schritt, sie in Ihrer robots.txt-Datei zu deklarieren. Dadurch wird es anderen Robotern (Bing.com usw.) leicht gemacht, sie zu erkennen.

Es ist so einfach wie das Hinzufügen einiger Zeilen wie diesen:
// public/robots.txt

User-agent: *


Sitemap: https://www.b4um.com/sitemap.xml
Sitemap: https://www.b4um.com/sitemap-pages.xml
Sitemap: https://www.b4um.com/sitemap-articles.xml

Meld dich an und schreibe ein Kommentar