PDA

Просмотр полной версии : Не работают ссылки вида index.php?id=1&L=1


gabdullin
26.10.2010, 18:25
Добрый день, коллеги!

На сайте работает мыльтиязычность настроенная на разные домены
domain.ru - русская версия сайта
domain.com - английская
в таком варианте все работает, как надо, работают ссылки вида:
domain.ru/ru/
domain.ru/en/
domain.com/ru/
domain.com/en/
но не работают ссылки вида:
http://domain.ru/index.php?id=1&L=1 (по идее должен быть английский, но выводит русский)
Отключаем RealURL эти ссылки начинают работать.

Что может быть? Помогите, пожалуйста!

Вот конфиг RealURL

<?php
$TYPO3_CONF_VARS['EXTCONF']['realurl'] = array (
domain.ru' => array (
'init' => array(
'enableCHashCache' => true,
'appendMissingSlash' => 'ifNotFile',
'enableUrlDecodeCache' => true,
'enableUrlEncodeCache' => true,
'emptyUrlReturnValue' => '/',
),
'preVars' => array (
array (
'GETvar' => 'no_cache',
'valueMap' => array (
),
'noMatch' => 'bypass',
),
array (
'GETvar' => 'L',
'valueMap' => array (
'ru' => '0',
'en' => '1'
),
'noMatch' => 'bypass',
'valueDefault' => 'ru',
),
array (
'GETvar' => '0',
'valueMap' => array (
),
'noMatch' => 'bypass',
),
),
'pagePath' => array (
'type' => 'user',
'userFunc' => 'EXT:realurl/class.tx_realurl_advanced.php:&tx_realurl_advanced->main',
'spaceCharacter' => '-',
'languageGetVar' => 'L',
'languageExceptionUids' => '',
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l18n_parent',
'autoUpdate' => true,
'expireDays' => 3,
'rootpage_id' => 1,
),
'fixedPostVars' => array (
'8' => array (
array (
'GETvar' => 'tx_indexedsearch[ext]',
'valueMap' => array (
'advanced' => 1,
),
'noMatch' => 'bypass',
),
),
),
'postVarSets' => array (
'_DEFAULT' => array (
// news archive parameters
'view' => array (
array (
'GETvar' => 'tx_ttnews[year]',
),
array (
'GETvar' => 'tx_ttnews[month]',
/* 'valueMap' => array(
'january' => '01',
'february' => '02',
'march' => '03',
'april' => '04',
'may' => '05',
'june' => '06',
'july' => '07',
'august' => '08',
'september' => '09',
'october' => '10',
'november' => '11',
'december' => '12',
)
*/
),
array (
'GETvar' => 'tx_ttnews[day]',
),
),
// news pagebrowser
'browse' => array (
array (
'GETvar' => 'tx_ttnews[pointer]',
),
),
// news categories
'category' => array (
array (
'GETvar' => 'tx_ttnews[cat]',
'lookUpTable' => array (
'table' => 'tt_news_cat',
'id_field' => 'uid',
'alias_field' => 'title',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array (
'strtolower' => 1,
'spaceCharacter' => '-',
// 'encodeTitle_userProc' => 'user_realurlEncTitle->process',
),
),
),
),
// news articles and searchwords
'article' => array (
array (
'GETvar' => 'tx_ttnews[tt_news]',
'lookUpTable' => array (
'table' => 'tt_news',
'id_field' => 'uid',
'alias_field' => 'title',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array (
'strtolower' => 1,
'spaceCharacter' => '-',
// 'encodeTitle_userProc' => 'user_realurlEncTitle->process',
),
),
),
array (
'GETvar' => 'tx_ttnews[swords]',
),
),
),
// '16' => '171',
),
'fileName' => array (
# 'defaultToHTMLsuffixOnPrev'=>1,
'index' => array (
'rss.xml' => array (
'keyValues' => array (
'type' => 100,
),
),
'rss091.xml' => array (
'keyValues' => array (
'type' => 104,
),
),
'rdf.xml' => array (
'keyValues' => array (
'type' => 101,
),
),
'atom.xml' => array (
'keyValues' => array (
'type' => 103,
),
),
'atom03.xml' => array (
'keyValues' => array (
'type' => 102,
),
),
'sitemap.xml' => array (
'keyValues' => array (
'type' => 200,
),
),
),
),
),
'domain.com' => 'domain.ru',
'_DOMAINS' => array (
'encode' => array (
array (
'GETvar' => 'L',
'value' => '0',
'ifDifferentToCurrent' => true,
'useConfiguration' => 'domain.ru',
'urlPrepend' => 'http://domain.ru'
),
array (
'GETvar' => 'L',
'value' => '1',
'ifDifferentToCurrent' => true,
'useConfiguration' => 'domain.com',
'urlPrepend' => 'http://domain.com'
),
),
'decode' => array (
'domain.ru' => array (
'GETvars' => array (
'L' => '0'
),
'useConfiguration' => 'domain.ru'
),
'domain.com' => array (
'GETvars' => array (
'L' => '1'
),
'useConfiguration' => 'domain.com'
),
),
),
);
?>

mazaev
26.10.2010, 23:00
RealUrl расширение которое превращает из id=1&L=1 в /ru.
Можно глупый вопрос? Зачем Вам такая ссылка?
При работе работе с RealUrl рекомендуется генерировать ссылки через typolink. Тогда все будет преобразовываться как нужно.

gabdullin
26.10.2010, 23:39
Можно глупый вопрос? Зачем Вам такая ссылка?
Ссылки вида index.php?id=1&L=1 нужны в следующих случаях:
1. при редактировании контента на английском языке, если страница не активна, просмотр ее вызывает затруднения, т.к. вместо английского, я вижу русский вариант в просмотре.
2. tt_news выводит в LIST и SINGLE, для английского варианта выводит транслитерованные алиасы русского варианта новости, вместо английского алиаса. В то время как dd_googlesitemap генерирует английские алиасы. Таким образом для английского варианта сайта поисковик находит две одинаковые страницы по двум адресам, что не есть хорошо для SEO.
3. в индексированном поиске результаты в английском варианте для новостей не выводятся, зато в русском показывает результаты и на английском и на русском.

P.S. До привязывания языков к разным доменам все работало отлично, таким образом я предполагаю, что проблема заключается в операции декодирования URL модуля realurl, поскольку в конфигурировании realurl я ошибок не обнаружил, хотя возможно я и заблуждаюсь на этот счет, почему и спросил.

P.P.S. Если кому-то станет интересно локализовать ошибку, готов дать доступ к админке и на FTP. Готов, также, обсудить вопрос разумной материальной компенсации за решение данного вопроса.

Андрей Аксенов
27.10.2010, 10:20
Может стоит почитать этот документ: http://typo3.org/documentation/document-library/core-documentation/doc_l10nguide/1.1.0/view/
Я думаю, что все ответы там есть - вопрос лишь в грамотной настройке.

gabdullin
27.10.2010, 10:33
Может стоит почитать этот документ: http://typo3.org/documentation/document-library/core-documentation/doc_l10nguide/1.1.0/view/
Я думаю, что все ответы там есть - вопрос лишь в грамотной настройке.
Прочитан и не раз. В том то и дело, что до момента привязки языка к домену все работает замечательно и с включенным realurl и с выключенным, поэтому стоит считать, что мультиязычность настроена правильно.

Андрей Аксенов
27.10.2010, 11:37
ну да, недочитал про "отключаем RealURL - начинает работать нормально"...
Значит проблема с ним... А что, если убрать "свои" настройки для RealURL и попробовать по-умолчанию? Будет ли работать?
И еще... Может что-то есть здесь: http://dmitry-dulepov.com/article/realurl-separate-language-domains-in-an-easy-way.html
Перевод этой статьи:
Легкое разделение языковых доменов при помощи RealURL
TYPO3 имеет полную поддержку создания многодоменных сайтов. Все знают параметр L в URL. Но что, если нужно создать раздельные домены для каждого языка в одном дереве страниц? До недавнего времени это было непросто сделать, и требовало определенной черной магии TYPO3. Здесь описано, как это сделать за 5 (или меньше) минут, а в качестве подарка получить лучшие позиции сайта в Google.
Обычно, при переключении языка сайта, в URL присутствует переменная L ('&L=1'). При использовании RealURL это будет выглядеть лучше, URL станет похож на http://example.com/en/. Вид значительно улучшился.
Проблема в том, что Google и другие поисковые движки предпочитают сервера в пользовательской доменной зоне. При одной ссылке, Google предпочтет домен «ru», домену «com», для русского и домен «de», для немецкого сайта. Поэтому, для поисковой оптимизации, становиться важным иметь домен в соответствующей стране зоне. Зарегистрировать домен просто, но как заставить RealURL использовать его, оставаясь в одном дереве страниц.
Разрешение этой проблемы — удаление языкового сегмента из URL, и преобразование http://example.com/ru/mypage в http://example.ru/mypage/ .
Возможно заполучить такие домены в TYPO3 после некого нетривиального колдовства с TypoScript. В качестве альтернативы — посредством написания кода. Но значительно проще, лучше и быстрее использовать RealURL.
Возможности RealURL для «языковых доменов»
Начиная с версии 1.5.0 RealURL поддерживает «языковые домены». Это именно то, что было описано выше: преобразование http://example.com/ru/mypage в http://example.ru/mypage/ прозрачно и без серьезных услий в TYPO3. Эта особенность требует лишь небольшой настройки RealURL.
Требования для настройки языковых доменов
Для включения языковых доменов, в настройках RealURL должно быть следующее:
определение языковых переменных в разделе preVars (смотрите выше)
специальную настройку _DOMAINS
С первой частью вопросов не возникает. А второе — что-то новенькое. Давайте сделаем ее!
Настройка _DOMAINS в RealURL
Настройка _DOMAINS описывает, как преобразуются значения параметров в URL в доменное имя. Другими словами, связывает переменную &L=0 с example.de, а &L=1 с example.ru.
Поддержка для этих языков настраива­ется в preVars примерно так:
'preVars' => array(
    array(
        'GETvar' => 'L',
        'valueMap' => array(
            'de' => 0,
            'ru' => 1
        ),
    ),
),
Теперь нужно определить, как эта preVar преобразуется в домены. А вот как:
'_DOMAINS' => array(
    'encode' => array(
        array(
            'GETvar' => 'L',
            'value' => '0',
            'useConfiguration' => 'example.com',
            'urlPrepend' => 'http://example.de'
        ),
        array(
            'GETvar' => 'L',
            'value' => '1',
            'useConfiguration' => 'example.com',
            'urlPrepend' => 'http://example.ru'
        )
    ),
    'decode' => array(
        'example.de' => array(
            'GETvars' => array(
                'L' => '0',
            ),
            'useConfiguration' => 'example.com'
        ),
        'example.ru' => array(
            'GETvars' => array(
                'L' => '1',
            ),
            'useConfiguration' => 'example.com'
        )
    )
)
Что здесь делается?
Первая часть кодирует URL. Здесь говориться, что при L=0 RealURL должно подставить http://example.de в URL (обратите внимание, без слеша в конце!). Для L=1 RealURL должно подставить http://example.ru в URL. Просто, не правда ли?
Вторая часть нужна для расшифровки. Она говорит RealURL, какой параметр L нужно установить, когда пользователь приходит на соответствующий домен. Также просто.
И финальное дополнение к настройкам:
$TYPO3_CONF_VARS['EXTCONF']['realurl']['example.de'] =
    $TYPO3_CONF_VARS['EXTCONF']['realurl']['example.ru'] = 'example.com';
Не забудьте добавить две новых записи для языковых доменов на корневую страницу в модуле Список.

gabdullin
27.10.2010, 18:27
ну да, недочитал про "отключаем RealURL - начинает работать нормально"...
Значит проблема с ним... А что, если убрать "свои" настройки для RealURL и попробовать по-умолчанию? Будет ли работать?
И еще... Может что-то есть здесь: http://dmitry-dulepov.com/article/realurl-separate-language-domains-in-an-easy-way.html
Перевод этой статьи:

Спасибо за качественный перевод статьи Дулепова, именно по этой статье я и настраивал переадресацию на домены. Путем экспериментов c изменением настроек realurl выяснил, что проблема возникает на стадии кодирования ссылок, поэтому либо я ошибся в конфигурировании этого куска realurl:
'_DOMAINS' => array (
'encode' => array (
array (
'GETvar' => 'L',
'value' => '0',
'ifDifferentToCurrent' => true,
'useConfiguration' => 'domain.ru',
'urlPrepend' => 'http://domain.ru'
),
array (
'GETvar' => 'L',
'value' => '1',
'ifDifferentToCurrent' => true,
'useConfiguration' => 'domain.com',
'urlPrepend' => 'http://domain.com'
),
),


либо в функции, выполняющей кодирование ссылок.

Андрей Аксенов
27.10.2010, 18:59
Кстати, логичнее было бы, чтобы русскоязычный сегмент относился к domain.ru, а англоязычный - к domain.com
И еще, может это опечатка, но в настройках следующее:
<?php
$TYPO3_CONF_VARS['EXTCONF']['realurl'] = array (
domain.ru' => array (

а надо бы:
<?php
$TYPO3_CONF_VARS['EXTCONF']['realurl'] = array (
'domain.ru' => array (

т.е. пропущена она кавычка перед domain.ru...

Тогда (если использовать ru - для русского языка, а com - для английского):

$TYPO3_CONF_VARS['EXTCONF']['realurl'] = array (
'domain.ru' => array (
...
'preVars' => array(
array(
'GETvar' => 'L',
'valueMap' => array(
'ru' => 0,
'en' => 1
),
),
),
...
'_DOMAINS' => array(
'encode' => array(
array(
'GETvar' => 'L',
'value' => '0',
'useConfiguration' => 'domain.ru',
'urlPrepend' => 'http://domain.ru'
),
array(
'GETvar' => 'L',
'value' => '1',
'useConfiguration' => 'domain.ru',
'urlPrepend' => 'http://domain.com'
)
),
'decode' => array(
'domain.ru' => array(
'GETvars' => array(
'L' => '0',
),
'useConfiguration' => 'domain.ru'
),
'domain.com' => array(
'GETvars' => array(
'L' => '1',
),
'useConfiguration' => 'domain.ru'
)
)
)

gabdullin
28.10.2010, 13:53
Кстати, логичнее было бы, чтобы русскоязычный сегмент относился к domain.ru, а англоязычный - к domain.com
У меня так и сделано...

т.е. пропущена она кавычка перед domain.ru...
Это опечатка...

Андрей Аксенов
28.10.2010, 14:58
Как вариант, может быть ошибка в самом RealURL, хотя и маловероятно, но все же...
можно написать на офф. форуме багов...
У меня была другая ситуация с RealURL - не прописывались аллиасы для страниц - оказалось баг, Дмитрий исправил в очередной версии. Может и это из этой же серии?

Podlec
21.02.2011, 16:04
Перечитал сообщения на форуме.
Подскажите, пожалуйста, конфигурацию RealURL, чтобы на одном домене (в зоне .com) ссылки вида ?L=1 переадресовывали на domain.com/en/

Заранее спасибо! :)

Андрей Аксенов
21.02.2011, 16:19
Перечитал сообщения на форуме.
Подскажите, пожалуйста, конфигурацию RealURL, чтобы на одном домене (в зоне .com) ссылки вида ?L=1 переадресовывали на domain.com/en/

Заранее спасибо! :)

array(
    'GETvar' => 'L',
    'valueMap' => array(
        'ru' => 0,
        'en' => 1,
    ),
    'noMatch' => 'bypass'
)
В этом примере, preVar ассоциирована с параметром URL “L”. valueMap указывает, что при L=0, переменная содержит /ru/, а при L=1 — /en/. А все остальные значения L будут игнорироваться.

Podlec
21.02.2011, 16:38
Сделал - переменные каким были, такими и остались, а при попытке ввести адресу руками (дополнительно /en/ и т.п.) - выбрасывает на главную страницу.

Podlec
21.02.2011, 17:08
Заработало! Спасибо! У меня просто были ошибки в коде.