Easy Sitemap
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.
Erstellen einer Beispiel App:
$ rails new SitemapApp $ cd SitemapApp
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
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.
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.
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>
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.
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
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
- 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.
- 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.
- 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.
- 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.
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
- 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.
- 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.
- Innerhalb des <sitemapindex>-Elements werden zwei <sitemap>-Elemente definiert, die jeweils eine separate Sitemap repräsentieren.
- 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
- 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.
- 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.
- 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
- Die Schleife @articles.each iteriert über eine Sammlung von Artikeln (@articles), im Gegensatz zur vorherigen Schleife, die über eine Sammlung von Seiten (@pages) iteriert.
- 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.
- 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.
- 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.
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
- 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.
- 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).
- 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.
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:
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