Witam. Na stronie mam ok. 99% treści ładowana dynamicznie ajaxem w zależności od "ruchów" odwiedzającego. Jak mogę rozwiązać problem pozycjonowania w wyszukiwarkach i ogólnie optymalizacji SEO? Standardowy kod strony nie zawiera praktycznie nic oprócz loga i stopki... Czy jeżeli zamieszczę gdzieś w stopce linki typu <a href="#xxx">xxx</a>
to crawlery to "zjedzą"? Dodam, że javascriptem obsługuję linki z hashami i w takim wypadku generuje stronę (no ale wciąż ajaxem).
Dość ciężka sprawa, ale do rozwiązania.
Do niedawna musiałbyś mieć na stronie prawdziwe linki, np. <a href="foo.php">xxx</a>
. Kod JS przetwarzałby DOM i pobierał URL-e z takiego linku. Po kliknięciu, wysyłałby żądanie do foo.php
. Skrypt foo.php
zwracałby zawartość, którą JavaScript wsadzałby w dane miejsce strony. Skrypt foo.php
mógłby też zostać wywołany przez crawler. Ba: crawler mógłby otrzymać pełny dokument HTML wraz z sekcją <head>
, <body>
itp., a Ajax mógłby doklejać do URL-a parametr, np. postaci foo.php?ajax=true
i wtedy odpowiedzi na żądania ajaxowe mogłyby być pozbawione tych sekcji <head>
-- składałyby się wyłącznie z tego fragmentu kodu HTML, który JavaScript wsadzałby w określony obszar dokumentu. Oczywiście, JavaScript mógłby też zmienić w locie URL linku z foo.php
na #foo
, by po kliknięciu w link zmienić URL bieżącej strony na potrzeby historii. Cała ta operacja w ogóle nie dotyczyłaby crawlerów, które po prostu podążałyby za zwykłymi linkami.
Podobną technikę, zwaną Hijax, Jeremy Keith opisał w książce "Kuloodporny Ajax".
Ale od stosunkowo niedawna działa inne rozwiązanie -- specjalny "protokół" dla stron ajaxowych:
http://www.seomoz.org/blog/how-to-allow-google-to-crawl-ajax-content
Czytałem o tym #!. Sprawa ma się tak, że strona jest dość "nietypowa" i ajax nie ładuje strony po kliknięciu linka a po innych czynnościach. Oznacza to w praktyce, że na stronie w kodzie nie ma linków. Spróbuję zrobić najważniejsze linki przy pomocy tego ! w stopce i mam nadzieję że to będzie wystarczyć.
A może lepszym sposobem będzie umieszczenie najważniejszych informacji w znacznikach <noscript>?
@kamdz:
Sporo zależy od tego, co konkretnie masz na tej stronie.
Rozumiem, że mimo wszystko po wykonaniu pewnych akcji pokazuje się użytkownikowi jakaś treść. W takim wypadku nie musi mieć znaczenia fakt, że te "akcje" to nie kliknięcia.
Mógłbyś np. mieć stronę jakiejś firmy kurierskiej. Załóżmy, że designer miał trochę poroniony pomysł i chciał, żeby strona była cool.
U góry strony jest stosik kopert, na dole kilka skrzynek, zatytułowanych "Aktualności", "O firmie", "Kontakt" itp. Żeby wyświetlić informacje kontaktowe, trzeba wziąć kopertę ze stosiku i -- metodą przeciągnij-i-upuść -- wrzucić ją do skrzynki "Kontakt".
Nieważne, że nie ma tu teoretycznie klikania w linki. Te skrzynki, od strony kodu mogłyby być zwykłymi linkami (do strony kontaktowej, aktualności itp.). Skrypty JS wyłączałyby te linki (evt.preventDefault()
) i robiły z nich cele dla drag'n'drop. Crawlery natomiast widziałyby zwykłe linki.
IMO posiadanie alternatywnej zawartości dla crawlerów to ostateczność. Dwie wersje praktycznie tej samej zawartości trudno otrzymać. W opisanym wyżej przykładzie strony ze skrzynkami i drag'n'drop nie ma tego problemu: JavaScript pobiera URL-e z linków, w samych linkach są też ikony przedstawiające skrzynki, więc tak naprawdę jest jedna zawartość, tyle że jest ona modyfikowana przez JS.
Jak się nie da inaczej, można zastosować te linki w stopce. Co do noscripta
to nie mam pewności na ile byłby on dobry, sam tego od dawna nie używam.
Wiesz, jeśli treści ładowanej Ajaxem nie jest tak dużo, to możesz rozważyć zrezygnowanie z Ajaxa i wrzucenie treści w kod normalnej strony. Skrypty by ukrywały całą treść oprócz tej, która w danej chwili ma być pokazana użytkownikowi.
Chyba skorzystam z rozwiązania pod google tzn. #!. Główna "nawigacja" to u mnie formularz więc nie ma na to rozwiązania. Dlatego wrzucę w stopkę ważniejsze linki z #! bo inaczej się google o treści w żaden sposób nie dowie. Dorobię po stronie serwera tylko żeby przy gecie ?escaped_fragment= renderowało całą stronę z konkretną treścią a przy np. ?escaped_fragment=...&ajax=true generowało tylko konkretny fragment to będzie najlepsze rozwiązanie. Mam tylko nadzieję że mi ze strony głównej pajączek pójdzie dalej wgłąb po linkach ze stopki... Dla pewności jeszcze dodam sitemap.xml, a właśnie umieścić w nim linki "ładne z #!" czy te brzydsze?