Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   Общие вопросы (http://forum.typo3.ru/forumdisplay.php?f=12)
-   -   Сделать правильнее сделать 301 Moved Permanently (http://forum.typo3.ru/showthread.php?t=9156)

musson 18.01.2011 14:14

Сделать правильнее сделать 301 Moved Permanently
 
Всем привет))
Перенес сайт с cms написанной на .Net на Typo3.
Все страницы раньше имели путь типа site.ru\contact.aspx ,
сейчас структура сайта такая же только расширение разное, с aspx поменялось на html.
Так как сайту уже год, поисковики уже проиндексировали сайт. Т.е. хочется чтобы при запросе скажем site.ru\contact.aspx typo3 выдавала 301 Moved Permanently и перекидывал на site.ru\contact.html т.е. просто достаточно менять с aspx на html т.к. структура осталась такая же.
Как это лучше реализовать?
К typo3 прикручен realurl.

musson 18.01.2011 17:22

сделал вот так, добавил в index.php

PHP код:

$linkRequest $_SERVER['REQUEST_URI'];
if(
preg_match("/.aspx$/",$linkRequest))
{
    
$toRedirect preg_replace("/(.aspx$)/",".html"$linkRequest);
    
header('HTTP/1.1 301 Moved Permanently');
    
header('Location: http://www.site.ru'.$toRedirect);
    exit();


либо


RewriteBase /
RewriteRule ^(.*)\.aspx$ $1.html [R=permanent,L]

-=UncleByte=- 19.01.2011 02:50

Редиректы самого сервера работают быстрее и не надо ничего менять в ядре системы.

dmartynenko 05.04.2011 19:31

Обнаружилась проблема с новым RealURL.
Одинаковый контент выдается как для урлов вида page/ и page.html
Раньше это решалось установкой в конфиге acceptHTMLsuffix = 1, но в последних версиях этот параметрв хоть и объявляется и описан в доке, но реально в коде не учитывается. Похоже что "принятие" урлов с .html зашито в коде, так как другие урлы, например .htm выдают 404 ошибку.

Попробовал в .htaccess такое решение:
Код:

RewriteBase /
RewriteRule ^(.*)\.html$ $1/ [R=permanent,L]

Работает - но теперь перестали работать страницы "версия для печати", урл которых конфигом RealURL был задан как .../page.html

Что посоветуете?

Updated: единственное что пока удалось сделать что бы все работало - поменять print.html на print.htm

-=UncleByte=- 06.04.2011 19:19

А если этот самый атрибут print транслировать просто в /адрес_страницы/ptint/ ?

dmartynenko 06.04.2011 19:38

Не получиться в .../print/
Так как RealURL умеет добавлять фиксированные переменные только в начало пути, т.е. /en/... или /print/...
Добавить "в самый конец" можно только опцией fileName.

Ну, вообщем, для конечного пользователя нет разницы как выглядит урл, можно и так и эдак сделать.

Самое главное, что для SEO плохо что page/ и page.html выдают одно и тоже, а это поведение что называется "из коробки".

-=UncleByte=- 07.04.2011 07:35

Так на самом деле вполне будет логично выглядеть url типа domain.tld/print/page/id/ - и совершенно точно он не будет отзываться ни на какие *.html
Хотя, насколько я помню при использовании .htaccess в мануале к RealURL был комментарий к какой-то строке "при использовании такой настройки filename работать правильно не будут" (это вольный перевод - передача общего смысла фразы). Можеть быть дело в этом?
Потому что у меня работает вроде как вполне адекватно все и при использовании .html и без него.

dmartynenko 07.04.2011 14:39

Цитата:

Сообщение от -=UncleByte=- (Сообщение 30812)
Так на самом деле вполне будет логично выглядеть url типа domain.tld/print/page/id/ - и совершенно точно он не будет отзываться ни на какие *.html

Судя по тому какое поведение я наблюдаю сейчас на последнем RealURL, то получиться что и в этом случае domain.tld/print/page/id/ и domain.tld/print/page/id.html будут показывать одно и тоже.

РЕШЕНИЕ!

Все оказалось просто, но не очевидно. В новой версии проверка наличия суффикса делается вот так:
PHP код:

protected function decodeSpURL_decodeFileName_checkHtmlSuffix($fileName$segment$extension, array &$pathParts) {
    
$handled false;
    if (isset(
$this->extConf['fileName']['defaultToHTMLsuffixOnPrev'])) {
        
$suffix $this->extConf['fileName']['defaultToHTMLsuffixOnPrev'];
        
$suffix = (!$this->isString($suffix'defaultToHTMLsuffixOnPrev') ? '.html' $suffix);
        if (
$suffix == '.' $extension) {
            
$pathParts[] = rawurlencode($segment);
            
$this->filePart '.' $extension;
        }
        else {
            
$this->decodeSpURL_throw404('File "' $fileName '" was not found (2)!');
        }
        
$handled true;
    }
    return 
$handled;


Т.е. даже если defaultToHTMLsuffixOnPrev установлен в ноль в конфиге, то это означает что .html суффиксы будут приняты!

Причем этот конфиг предлагается по умолчанию как в примерах, так и в autoconf, вот кусок из class.tx_realurl_autoconfgen.php
PHP код:

'fileName' => array(
    
'defaultToHTMLsuffixOnPrev' => 0,
    
'acceptHTMLsuffix' => 1,


Поэтому, что бы суффиксы .html давали 404 ошибку, строку с defaultToHTMLsuffixOnPrev из конфига нужно убрать совсем!

PS: Скорее это просто баг, на это указывает то что при генерации этот параметр учитывается простой проверкой, а не isset()
PHP код:

    elseif ($url != '') {
        
$suffix $this->extConf['fileName']['defaultToHTMLsuffixOnPrev'];
        if (
$suffix) { 


-=UncleByte=- 07.04.2011 15:33

Скорее надо выставить acceptHTMLsuffix в 0 - тогда RealURL не будет его воспринимать как еще один вариант именования страницы. Насколько помню это сделано для упрощения миграции со статичных сайтов на динамические.

dmartynenko 07.04.2011 15:38

Может быть ту информацию, которую я излагал выше сложно целиком воспринять.
Но еще раз повторю то, что уже писал - acceptHTMLsuffix в последних версиях RealURL не используется и не учитывается нигде.


Часовой пояс GMT +4, время: 05:13.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot