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

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

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

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

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

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, где перечислить все ссылки со всеми возможными языками, но всё равно нужно на странице проверять, робот ли её посещает, али человек
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Если кого заинтересует данный вопрос детальнее, вот тестовый код:

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

<?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]
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Я бы не так сделал:
Создаешь файло типа ru.lang и en.lang
там пишешь типа $title = "yo";
А в теле сайта все задаешь значениями типа $title $button_name итп
И при загрузке переключаешь чего грузить, ну естественно надо проверять куки на существование и если так чтение метки о ранее выбранном языке либо прогрузке по умолчанию и создании куков если это возможно.....
Тогда робот считает то что грузиться по умолчанию..
[syntax=Delphi] [/syntax]
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Duncon, спасибо, что откликнулся.
Но языковой контент лежит в БД, вся проблема как раз в том, как проверять куки на существование .
Поскольку я не знаю, как работает робот, но валидатор, как я уже говорил, вернул мне HTTP ошибку.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

попробуй вот таким простым способом на js причем я с кукисы обычно им и обрабатываю..

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

<script language="javascript" type="text\javascript">
<--
if (document.cookie!=""){
document.write("Я нашел кук")
}
-->
</script>
Если сработает, дальше мам додумаешь...
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Duncon,

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

СПАСИБО !

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

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

Единственная проблема:
Индексироваться будет только язык по умолчанию, хотя это можно обойти через robots.txt, наверное.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Надо посмотреть потестить, по идее все найденный ссылки после ? должен проиндексировать или есть такая вещь как карта ссылок, правда ее редко кто использует, но может помочь если так обломает..
А по поводу robots.txt там пишеться только куда не лазать (по дирректориям), хотя я не углублялся может можно и ссылки забивать, но мне это пока не нужно было..
[syntax=Delphi] [/syntax]
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Duncon,
если язык будет устанавливаться в куки на JS, то в ссылках параметр lang вообще фигурировать не будет!
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

А зачем тебе этот параметр, я про обычные php ссылки.
Робот прочешит сайт и все найденное запишет(у меня где-то спецальная софтиночка для таких тестов валяется).
Так что достаточно как-нибудь где нибудь сослаться на страничку с другим языком, как-то на понятно да, но наверняка у тебя все создается в динамике так что, думается все должно проиндекся без гемороя обе части, хотя надо смотреть на результат...
[syntax=Delphi] [/syntax]
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

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