Страница 1 из 2

смена языка (отключеные Cookies)

Добавлено: 15 дек 2005, 00:46
Oscar
Вопрос такой: Как можно определить, посещает ли мою страницу робот, или человек?

Самописные роботы не интересуют, важно, чтобы поисковики правильно индексировали страницы.

Почему возник вопрос?

PHP

Меняю язык сайта через Cookie, с последующим перебросом через
header("Location: SELF_without_Language_Parameter");

Если пустить такую страницу через валидатор - возвращается ошибка 302.

Сервер не знает, включены ли Cookie у пользователя, потому хочу сделать следующее.
Если пользователь - робот, пропускать установку Cookie и ставить язык по дефолту (или же из параметра $_GET, если установлен)
(ясно, что индексироваться будет только один язык .. может в будущем перепишу все ссылки для НЕ Cookie).

Получаю ссылки смены языка (иконка с флагом):

href="?content=...&lang=ru"
href="?content=...&lang=en

(устанавливает Cookie в язык и перебрасывает на "?content=...")

остальные же ссылки всегда:

href="?content=news"
href="?content=about"
и т.д.

Красиво и удобно, но ... страницы не будут, как я предполагаю, индексироваться.

Если есть стандартные решения - буду рад их узнать.

(Многоязыковые страницы, которые я видел, показывают просто параметр lang в строке запроса. Хотелось бы этого избежать.)

1. Как можно на php узнать отключены ли Cookie?

если нельзя, то:

2. Как можно быть уверенным, что страницу посещает не пользователь, а робот?
(Наверное нужно проверять $_SERVER["HTTP_USER_AGENT"], но на какие значения? .. )

Возможный вариант решения: положить на сервер: robots.txt, где перечислить все ссылки со всеми возможными языками, но всё равно нужно на странице проверять, робот ли её посещает, али человек

Добавлено: 15 дек 2005, 01:17
Oscar
Если кого заинтересует данный вопрос детальнее, вот тестовый код:

Код: Выделить всё

<?php
	function makeURL() {
		$location = array();
		foreach($_GET as $k => $v) {
			if ($k != "lang")
				$location[count($location)] = "$k=$v";
		}
		return (implode("&", $location) == "")?"":"?".implode("&", $location);
	}

	if ($_GET["lang"] != "") {
		if ($_GET["lang"] == "ru")
			$lang=$_GET["lang"];
		else
			$lang="en";

		setCookie("language", $lang);
		header("Location: ./".makeURL());
	}

	$lang = $_COOKIE["language"];

	if ($lang == "") {

		$lang="en";

		setCookie("language", $lang);
		header("Location: ./".makeURL());
	}

	$x = $_GET["x"];
	$y = $_GET["y"];

	echo "[align=center]<h1>lang = $lang & x = $x & y = $y</h1>[/align]\n";
?>
Change language: [url=<?=(count($_GET)==0)?]">ru[/url]  [url=<?=(count($_GET)==0)?]">en[/url]




[url=./?x=1]x = 1[/url]

[url=./?x=1&y=1]x = 1 & y = 1[/url]

[url=./?x=1&y=2]x = 1 & y = 2[/url]



[url=./?x=2]x = 2[/url]

[url=./?x=2&y=1]x = 2 & y = 1[/url]

[url=./?x=2&y=2]x = 2 & y = 2[/url]

Добавлено: 15 дек 2005, 12:35
Duncon
Я бы не так сделал:
Создаешь файло типа ru.lang и en.lang
там пишешь типа $title = "yo";
А в теле сайта все задаешь значениями типа $title $button_name итп
И при загрузке переключаешь чего грузить, ну естественно надо проверять куки на существование и если так чтение метки о ранее выбранном языке либо прогрузке по умолчанию и создании куков если это возможно.....
Тогда робот считает то что грузиться по умолчанию..

Добавлено: 15 дек 2005, 22:59
Oscar
Duncon, спасибо, что откликнулся.
Но языковой контент лежит в БД, вся проблема как раз в том, как проверять куки на существование .
Поскольку я не знаю, как работает робот, но валидатор, как я уже говорил, вернул мне HTTP ошибку.

Добавлено: 16 дек 2005, 12:25
Duncon
попробуй вот таким простым способом на js причем я с кукисы обычно им и обрабатываю..

Код: Выделить всё

<script language="javascript" type="text\javascript">
<--
if (document.cookie!=""){
document.write("Я нашел кук")
}
-->
</script>
Если сработает, дальше мам додумаешь...

Добавлено: 16 дек 2005, 12:54
Oscar
Duncon,

чёрт, а ведь действительно всё гениально просто! ))

СПАСИБО !

Что за глупая идея ставить эту куку со стороны сервера ..

Кука ставится на клиенте, читается на сервере.
При смене языка: 1. устанавливаем у клиента куку. 2. перегружаем страницу с тем же адресом

Единственная проблема:
Индексироваться будет только язык по умолчанию, хотя это можно обойти через robots.txt, наверное.

Добавлено: 16 дек 2005, 15:56
Duncon
Надо посмотреть потестить, по идее все найденный ссылки после ? должен проиндексировать или есть такая вещь как карта ссылок, правда ее редко кто использует, но может помочь если так обломает..
А по поводу robots.txt там пишеться только куда не лазать (по дирректориям), хотя я не углублялся может можно и ссылки забивать, но мне это пока не нужно было..

Добавлено: 16 дек 2005, 16:30
Oscar
Duncon,
если язык будет устанавливаться в куки на JS, то в ссылках параметр lang вообще фигурировать не будет!

Добавлено: 16 дек 2005, 16:59
Duncon
А зачем тебе этот параметр, я про обычные php ссылки.
Робот прочешит сайт и все найденное запишет(у меня где-то спецальная софтиночка для таких тестов валяется).
Так что достаточно как-нибудь где нибудь сослаться на страничку с другим языком, как-то на понятно да, но наверняка у тебя все создается в динамике так что, думается все должно проиндекся без гемороя обе части, хотя надо смотреть на результат...

Добавлено: 16 дек 2005, 17:12
AiK
СЗОТ: robots.txt сделан для того, чтобы запрещать индексирование отдельных страниц или директорий, а не разрешать.
Спайдеры ходят только по plain HTML ссылкам (за редким исключением). Соответственно, чтобы спайдер смог проиндексировать все языковые версии, ему эти ссылки необходимо предоставить.