Saubere URLs

Autor:Volker Grabsch

Inhalt

Einleitung

Quelle:
http://www.w3.org/Provider/Style/URI

What makes a cool URI? A cool URI is one which does not change. What sorts of URI change? URIs don't change: people change them.

Grundproblem:
nicht funktionierende URLs

Typische Gründe:

  • Wir mussten die Webseite reorganisieren.
  • Ein anderer User verwaltet die Dateien.
  • Früher war es ein Perl-Script, jetzt sind es statische Seiten / PHP-Scripte / ...
  • Wir würden gern, aber uns fehlen die richtigen Werkzeuge.

Wege zur Besserung:

  • URL-Design praktizieren
  • URLs müssen langlebig sein
  • URLs sollten kurz und leicht zu merken sein

Wie geht das?

  • URLs müssen die Struktur der Inhalte widerspiegeln

  • URLs müssen so wenige Informationen wie möglich enthalten:

    • keine Autor-Namen
    • keine Überschriften
    • keine Status-Information ("alt", "Entwurf", ...)
    • keine Zugangs-Informationen ("öffentlich", "Mitglieder", ...)
    • keine Datei-Endungen
    • kein Hinweis auf die benutzte Software (/cgi-bin/, .php, ...)

Webserver

Life-Präsentation:

  • CGI-Parameter
  • RewriteRules im VirtualHost
  • RewriteRules in .htaccess
  • KISS: ScriptAlias
  • Optimiertes KISS: ScriptAlias + Alias

Script

Django URLconf:
from django.conf.urls.defaults import patterns

urlpatterns = patterns('',
    (r'^articles/2003/$',                  'news.views.special_case_2003'),
    (r'^articles/(\d{4})/$',               'news.views.year_archive'),
    (r'^articles/(\d{4})/(\d{2})/$',       'news.views.month_archive'),
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)

Auflösung von /articles/2005/03/:

news.views.month_archive(request, '2005', '03')

Variante: Named groups

from django.conf.urls.defaults import patterns

urlpatterns = patterns('',
    (r'^articles/2003/$',                                          'news.views.special_case_2003'),
    (r'^articles/(?P<year>\d{4})/$',                               'news.views.year_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$',              'news.views.month_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
)

Auflösung von /articles/2005/03/:

news.views.month_archive(request, year='2005', month='03')