Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[MVC3] Frage zum Routing (in Hinblick SEO)
Stipo
myCSharp.de - Member

Avatar #avatar-2966.gif


Dabei seit:
Beiträge: 699
Herkunft: Lörrach

Themenstarter:

[MVC3] Frage zum Routing (in Hinblick SEO)

beantworten | zitieren | melden

Hallo zusammen,

das Routing aus der Vorlage in Visual Studio ist ja nicht besonders SEO Optimal. Es ist zwar bedeutend besser, als wenn man Url hat, die mit ?id=123 enden, aber eben noch nicht perfekt.

Nun suche ich gerade den Weg, wie ich Url in den nach folgenden beispielen hinbekommen kann:

http://www.domain.de/HerstellerName1/HerstellerProdukt1.html
http://www.domain.de/Anita/Anita-Entlastungs-BH-Jana-bis-I-Cup.html
Hier soll auf den "HerstellerController" gemappt werden. Der HerstellerName wird aber erst zur Laufzeit bekannt sein (ca 15 - 20 Hersteller), was dann einen festen Controller pro Hersteller ja nicht möglich macht, und auch nicht besonders geschickt ist.

http://www.domain.de/CategorieName1/Seite1.html
http://www.domain.de/Bademode/Seite1.html
Das soll dann auf den "CategorieController" gemappt werden. Das ganze analog zu den Herstellern, nur das hier mit über 100 Kategorienamen gerechnet werden kann.

http://www.domain.de/impressum.html
Soll dann auf "ContentController" gemappt werden. Wieder analog wie bei den obigen beiden, das erst zur Laufzeit bekannt ist, was da stehen muss.

Hintergrund ist, das obige Url durch die Sumas am besten gelistet werden. Auch sind Url in der form http://www.domain.de/Products/Detail/1 nicht sehr aussagekräftig für den Benutzer.

Leider finde ich da nicht die richtigen Infos, oder ich verstehe zu schlecht, was mir die Seiten da auf Englisch vermitteln wollen. Deshalb würde es mich freuen, wenn mir hier jemand einen Link geben kann, der mich da ein stück weiter bringt, ohne das ich da lange suchen muss, ob das was da steht auch dem entsprechen würde, was ich erreichen möchte.

Ihr wisst ja, mein Englisch ist bescheiden, wodurch es mir manchmal schwer fällt, auf einer Seite schnell genug zu sehen / entscheiden, ob mir das hilft oder nicht.

Danke euch allen schon für die Arbeit.

Grüße
Stephan
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.826

beantworten | zitieren | melden

Hi,
Zitat von Stipo

http://www.domain.de/HerstellerName1/HerstellerProdukt1.html
http://www.domain.de/Anita/Anita-Entlastungs-BH-Jana-bis-I-Cup.html

http://www.domain.de/CategorieName1/Seite1.html

http://www.domain.de/impressum.html

Hier bekommst Du einen "indirekten Interessenkonflikt". Du musst wissen, dass die erste Route, die in der Routingtabelle passt, auch genommen wird - egal ob eine andere evtl ebenfalls passt.

Zwangsläufig wird ein /{controller} auf impressum.html anschlagen, weshalb dieses Fest geroutet werden muss. Macht auch Sinn, da es sich hier ja nicht um einen dynamischen Inhalt handelt.

Damit diese Routen funktionieren, musst Du wirklich alle Rahmen-Routen definieren.

Das heißt, zuerst alle Route, die auf der Basis (Home) agieren.
Im Falle des Impressums wäre es einfach

  routes.MapRoute(
              "Impressum",
              "impressum.html",
              new { controller = "ContentController", action = "Impressum" }
            );

Der Hersteller wäre

  routes.MapRoute(
              "HerstellerProdukt",
              "{herstellerName}/{herstellerProduktName}.html",
              new { controller = "HerstellerController", action = "Index" }
            );
Die Action "Index" hat nun die string-Properties herstellerName und herstellerProduktName.

Das Problem an der Sache ist nun aber, dass die Kategorie als Hersteller erkannt wird, und Seite1 als der Produktname.

Aus SEO-Sicht sind Deine Routen aber eh nicht optimal - sie entsprechen nicht dem Breadcrumbs-Gedanken von Google.

Besser wäre
  • /Hersteller - Zeigt eine Liste aller Hersteller (Index Action im HerstellerController)
  • /Hersteller/{Name}.html - Zeigt die Details eines Herstellers (Details Action mit name Parameter im HerstellerController)
  • /Hersteller/{Name}/Produkte.html = Alle Produkte
  • /Hersteller/{Name}/{ProduktName}
  • /Kategorien - Zeigt eine Liste aller Kategorien
  • /Kategorie/{Name}.html - Zeigt die passenden Inhalte
  • /Kategorie/{Name}/Seite{Nummer}.html - Mit der Nummer kannst Du nun ein Paging aufbauen


Diese "Brötkrümel"-Variante ist absolut einfach in den Routes nachzubilden und fehlerfrei zu behandeln und entspricht dem SEO Gedanken, den Du wohl suchst.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Abt am .
private Nachricht | Beiträge des Benutzers
Stipo
myCSharp.de - Member

Avatar #avatar-2966.gif


Dabei seit:
Beiträge: 699
Herkunft: Lörrach

Themenstarter:

beantworten | zitieren | melden

Hallo Abt,

danke erstmal für die Hilfe.
Zitat
Besser wäre
/Hersteller - Zeigt eine Liste aller Hersteller (Index Action im HerstellerController)

/Hersteller/{Name}.html - Zeigt die Details eines Herstellers (Details Action mit name Parameter im HerstellerController)

/Hersteller/{Name}/Produkte.html = Alle Produkte

/Hersteller/{Name}/{ProduktName}
/Kategorien - Zeigt eine Liste aller Kategorien

/Kategorie/{Name}.html - Zeigt die passenden Inhalte

/Kategorie/{Name}/Seite{Nummer}.html - Mit der Nummer kannst Du nun ein Paging aufbauen
Diese "Brötkrümel"-Variante ist absolut einfach in den Routes nachzubilden und fehlerfrei zu behandeln und entspricht dem SEO Gedanken, den Du wohl suchst.

Wie stehst Du mit der Aussage zu den "Brotkrümel" und den davor geschalteten festen begriffen Hersteller/Kategorie zu der aussage, dass je tiefer die Ordnerstrucktur einer Seite ist, sich der PageRank dadurch verringert?
Okay, der PageRank ist nicht das Maß an dem man sich messen soll, aber ich habe schon bemerkt, das Artikel welche nicht so tief verschachtelt werden, auch besser gefunden werden.

Ansonsten scheint mir das genau die Default-Route das schon so macht.
Ich sehe schon. ASP.NET MVC 3 hat sicher nicht den anspruch, das es einfacher ist als WebForms :) Es ist wohl genauso anspruchsvoll, nur auf eine anderen Art und an manchen stellen eben einfacher. Da muss dann wohl oder übel mal noch ein Buch ins Regal kommen :)

Den "Breadcrumbs-Gedanken von Google" habe ich mir mal durchgelesen.
Ich muss mir da einfach nochmal gedanken drüber machen, wie ich das realisieren möchte. Eventuell auch mal einen Test fahren, was besser kommt.

Grüße
Stephan
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.826

beantworten | zitieren | melden

Der Sinn von Breadcrumbs ist nicht das simple Erhöhen des PageRanks, sondern die Struktur der Seite zu definieren.
Zitat
Eine Breadcrumb-Spur setzt sich aus mehreren Links (Breadcrumbs) zusammen, die einem Nutzer helfen, die Hierarchie Ihrer Website zu verstehen
Ich stehe daher zu der Aussage von Google, den Aufbau der Seite klar zu strukturieren und den Anwender klar zu sagen wo er ist, wo er hin kann und ihn auf gewisse Art und Weise lenken, wo er hin soll.
Dass die Tiefe einer URL das PageRanking negativ beeinflusst, mag ich massiv bezweifeln.

Durch die von mir genannte Variante hast Du zusätzlich die Möglichkeit, die Hauptthemen der Seite direkt einer Suchmaschine bekannt zu machen, wie es zum Beispiel die Stuttgarter Nachrichten (VFB, Polizeibericht, Stuttgart 21) macht.

Da der Name des Herstellers und der Name der Kategorie zu zwei unterschiedlichen Themen gehört, muss hier nach dem Breadcrumb-Gedanken auch eine klare Trennung rein - siehe auch das Beispiel mit Bücher und Autoren im Google Link.
Ehrlich gesagt gibts da auch gar nicht so viel zu diskutieren - es ist einfach so :)

Willst Du aber Deine Variante verwirklichen, dann musst Du Routings vergessen und alle Anfragen auf eine einzige Action verweisen, die dann Deine "Sonderbehandlung" übernehmen muss.

MVC hat den Anspruch Business-Gesteuert zu agieren und eine deutliche Trennung der Schichten erreichen zu können. Im Prinzip ist es einfacher, da man auf die Aktion der Anwendung immer volle Kontrolle hat, was Du bei WebForms aufgrund der gewissen Automatik nicht hast.
MVC ist aber im Prinzip nichts anderes als ein Wrapper um den ASP Kern. Auch bei WebForms hast Du hier die Möglichkeit des Routings - und zwar auf die identische Art und Weise.


Edit:
Wenn Du der Meinung bist, dass ein / Google erkennen lässt, wo die Trennung stattfindet, dann nutze ein anderes Trennzeichen, wie zum Beispiel Hersteller_ProduktName. Ich bezweifel es - dafür sind die Suchmaschinen zu intelligent.
Somit hast Du eine "virtuelle Trennung", aber eine einfache Variante, um zwischen den Controllern und Actions unterscheiden zu können. Es ist ja egal wie die Trennung stattfindet - Hauptsache Du erkennst sicher was was ist.

Es bringt nichts, wenn Du im PageRank oben bist, aber Deine Anwendung den falschen Content anzeigt, weil man nicht erkennen kann, was der Benutzer möchte.
Dann ist der Blitzschnell wieder bei Amazon.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Abt am .
private Nachricht | Beiträge des Benutzers
ben
myCSharp.de - Member



Dabei seit:
Beiträge: 200
Herkunft: Schweiz

beantworten | zitieren | melden

Interessanter Beitrag!

Das ergänzt meinen Post ganz gut.
Zitat von Stipo
Wie stehst Du mit der Aussage zu den "Brotkrümel" und den davor geschalteten festen begriffen Hersteller/Kategorie zu der aussage, dass je tiefer die Ordnerstrucktur einer Seite ist, sich der PageRank dadurch verringert?
Das ist es, was ich auch denke... wobei das inzwischen vielleicht nicht mehr so relevant ist, da den Suchmaschinen heutzutage eh klar ist, dass jede auf Suchmaschinen angewiessene Website UrlRewriting benutzt.
Zitat von Stipo
routes.MapRoute(
"Impressum",
"impressum.html",
new { controller = "ContentController", action = "Impressum" }
);
Finde die "RootContraint" Lösung auch ganz toll :)
Zitat von Abt
Willst Du aber Deine Variante verwirklichen, dann musst Du Routings vergessen und alle Anfragen auf eine einzige Action verweisen, die dann Deine "Sonderbehandlung" übernehmen muss.
Oder man benutzt eigene RouteContraints. In der Implementierung kann man dann eine Datenbank-Abfrage absetzen und schauen, ob der "PageName" gefunden wurde. Das wäre IMHO noch etwas übersichtlicher.


      routes.MapRoute(
        "HerstellerProdukt",
        "{herstellerName}/{herstellerProduktName}.html",
        new { controller = "HerstellerController", action = "Index" },
        new HerstellerConstraint()
      );
Das gleiche dann mit den Kategorien. Dabei muss natürlich gegeben sein, dass der Root-"PageName" eindeutig ist.
private Nachricht | Beiträge des Benutzers