Jaka najlepsza opcja na dodanie SEO do strony z nawigacją w AJAXie?

0

Męczę temat już dobre 2 dni i oto co do tej pory mam.

Generalnie bazuję na tutorialu Googla, ale nie wszystko jeszcze jest dla mnie do końca jasne.

Pododawałem href-y do wszystkich linków w stylu
<a href="#!site=contact"
a także dodałem dynamiczną zmianę URLa (przy przełączaniu podstron) za pomocą:

history.pushState({}, "career", "#!site=career" );

Działać ma to podobno tak, że bot przy napotkaniu "ładnego" linka typu #!site=about zamienia go do postaci ?_escaped_fragment_=site=about Otwiera go, ale indeksuje, z tego co zrozumiałem, tego pierwotnego, ładnego linka z "#!". Pierwsze pytanie: czy zrobi to automatycznie czy trzeba przygotować skrypt który zamieni URLa za niego?

Przy otwieraniu "brzydkiego" linka, PHP-owym GET-em sprawdza zmienną site i na podstawie jej wartości wyświetli snapshot strony bez używania JS :

<div id="content-wrapper">
<?php
if (isset($_GET['site'])) {
	if ($_GET['site']=='contact') $this->load->view('contact');
	if ($_GET['site']=='about') $this->load->view('about');
(....)
}
?>
</div>

($this->load->view, bo używam CodeIgniter)
Taka jest póki co idea, jeszcze nietestowana, bo nie wiem jak działa wspomniane wyżej mapowanie URLów.

0

Treść strony jest generowana przez JSa czy po prostu podmieniasz treść strony używając odpowiedzi AJAXowej? Jeśli to 2 to pozbądź się całego #! przed URLem. Działać będzie to wtedy podobnie do Turbolinks.

0

Nie wiem, ja w niej tylko robię SEO ;) ale wygląda na to że AJAX :

	$("#content-wrapper").on('click', '#return-button', function(event) {
		// removeReturnButton();
		var view = $(this).data('target');
		$.ajax({
			url: 'php/controller.php',
			type: 'POST',
			data: {view: view},
		})
		.done(function(data) {
			$('#content-wrapper').html(data);
			
		})
		.fail(function(data) {
			console.log(data);
		});
	});

a w controller.php :

<?php 
require_once("database.php");

$dir = '../pages/';

if(isset($_POST) && !empty($_POST)){
	if(isset($_POST['view'])){
		$view = $_POST['view'];
		// zwrot do AJAX
		$file = $dir.$view.'.php';
		if (file_exists($file)) {
			$buffer = ob_start();
			include($file);
			ob_get_flush();
			
			// echo $page_return;
		} else {
			echo "<h1 class='notfound'>У цяперашні час недаступна.</h1>";
		}
	}

}

?>

Jak to pozbyć się #!? a nie z #!site= ?

0

Czyli masz Turbolinks. Wystarczy zrobić tak by przy zapytaniach nie-AJAXowych zwracało całą stronę WWW (razem z layoutem). Można to zrobić sprawdzając nagłówki. A wszystkie linki wymienić na takowe bez haszbangów. Powinno działać.

Innym wyjściem jest zrobić to samo co wcześniej, ale tylko dla linków w postaci ?_escaped_fragment_=site=about.

0
winerfresh napisał(a):

Wystarczy zrobić tak by przy zapytaniach nie-AJAXowych zwracało całą stronę WWW (razem z layoutem). Można to zrobić sprawdzając nagłówki.

To wcale nie jest takie małe błahe "wystarczy zrobić" dla mnie jeśli tego jeszcze nie robiłem ;)

Zrobiłem by strona wczytywała podstrony zależnie od wartości 'site' w URLu (po location.hash) dla usera, ale nie wiem jak przygotować ją pod crawlery. Póki co, w divie, do którego ładowany jest content, mam:

$files = glob('./pages/*.php'); // pobiera nazwy plikow .php z folderu pages i zapisuje jako tablice

foreach ($files as &$file) {
	$file = substr($file, 8, -4); // wycina z nazw plikow z poczatku './pages/' i z konca '.php'

}

// jesli podano w URLu wartosc site i istnieje taka strona to ja wczytaj
if (isset($_GET['site'])) {
	if (in_array($_GET['site'], $files)) {
 		include ("./pages/".$_GET['site'].".php");
 	}
}

tylko, że:

  1. po konwersji do "brzydkiego" URLa fragment "escaped_fragment" jest zbędny, jak najlepiej go usunąć - albo - żeby bez usuwania można było odczytać zmienną site? (tak, nie chcę rezygnować z #!)
  2. div z contentem domyślnie jest niewidoczny (strona zaprojektowana jest tak, że widać albo menu albo content), mogę to jakoś obejść? nie uśmiecha mi się tworzenie dodatkowych 30 statycznych stron dla każdej podstrony

edit: ale tak teraz myślę, że przecież googlebotów obchodzi tylko content więc wystarczy żeby podstrony pojawiały się w źródle strony, czyż nie? Indeksować się i tak będą podstrony z "#!" odpalane przez JS.

1 użytkowników online, w tym zalogowanych: 0, gości: 1