7 wichtige Punkte für SEO-konforme CMS-Templates
Mag vielleicht trivial sein, aber ich bin gestern wieder über einen relativ häufigen Optimierungsfall gestolpert, der zumindest in der Entwicklungsphase nicht immer so einfach zu Tage tritt:
1 2 3 4 5 6 7 8 9 10 |
SELECT a.article_id , a.headline , a.images FROM babel_videogameszone.article a , public.MAIN_DVD b WHERE a.entity_id = b.id AND a.article_type_id in (1,2,5,6,34,38,41) AND checkRegex(a.images,'µ.*?µ') ORDER BY a.published desc LIMIT 4 |
Das Query läuft ca. 1,3 Sekunden – nicht gut. Was passiert hier?
Weiterlesen
Kurzes Snippet, um CORS in einer remote CFC-Methode zu erlauben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<cfscript> // allow CORS requests from these domains only, leave off the subdomain variables.lstInternalDomains = 'foo.de,bar.de'; </cfscript> <cffunction name="setJSONHeaders" access="private" output="yes" returntype="void"> <cfargument name="lstInternalDomains" type="string" required="yes" /> <cfscript> var local = {}; local.pc = getpagecontext().getresponse(); local.pc.getresponse().setcontenttype('application/json; charset=utf-8'); local.headers = getHttpRequestData().headers; local.origin = ''; if (structKeyExists(local.headers,'Origin')) { local.origin = local.headers['Origin']; local.objUrl = createObject('java','java.net.URL').init(javaCast('string',local.origin)); local.strDomain = ReReplace(local.objUrl.getHost(),'^(?:.*\.)?([^.]*\..*)$','\1','ONE'); if (listFindNoCase(arguments.lstInternalDomains,local.strDomain)) { local.pc.setHeader('Access-Control-Allow-Origin',local.origin); local.pc.setHeader('Access-Control-Allow-Methods','GET, POST, HEAD, OPTIONS'); local.pc.setHeader('Access-Control-Allow-Headers','X-Requested-With, Origin, Content-Type, Accept'); } // end if (listFindNoCase(variables.lstInternalDomains,local.strDomain) } // end if (structKeyExists(local.headers,'Origin') return; </cfscript> </cffunction> ... <cffunction name="myMethod" access="remote"> <cfscript> if (structKeyExists(URL,'returnFormat') and (URL.returnFormat eq 'json')) { setJSONHeaders(lstInternalDomains=variables.lstInternalDomains); } ... </cfscript> </cffunction> |
Verwendung z.B. in jQuery
1 2 3 4 5 6 7 8 9 |
$.ajax({ url: 'http://www.remotedomain.de/webservices/MyComponent.cfc?returnFormat=json&method=myMethod', type: 'POST', data: {foo:'bar'}, crossDomain: true, success: function(data){ console.log(data); } }); |
Eine saubere URL-Struktur mit echten Permalinks ist sicher ein wichtiges Element der OnSite-Optimierung. Damit das Konstrukt aber auch gegen äußere Einflüsse (d.h. URL-abtippende User, String-Destruction in Foren, E-Mail-Programmen u dgl.) stabil bleibt, sollte jede aufgerufene Seite zum einen ihre kanonische URL entweder im HTTP-Header oder als Canonical-Tag schicken. Außerdem sollte sie beim Aufruf den URL prüfen, mit dem sie aufgerufen wurde, diesen gegen den Canonical-Wert testen und bei Diskrepanzen entsprechend reagieren.
Jeder Round-Trip zur Datenbank kostet Zeit und Ressourcen. Oftmals hat man aber das Problem, dass man zu einem Datum noch eine unspezifizierte Anzahl von Relationen braucht. Meistens holt man die dann in einem Loop in der Applikation, denn üblicherweise bekommt man in den Ergebnisfeldern eines SQL-Queries nur flache Daten zurück. Mit PostgreSQL und JSON in der Datenbank geht das in manchen Fällen aber eleganter – und man kann ein gutes Dutzend Queries auf genau eine schnelle Abfrage reduzieren.
Weiterlesen