Помогите с редиректом

Модератор: Модераторы разделов

Ответить
GNUUser
Сообщения: 89

Помогите с редиректом

Сообщение GNUUser »

Перевожу сайт с Ucoz на CMS, уже перенес шаблон, но споткнулся на одном моменте. Оказывается что на Укозе все урлы примерно такие:

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

http://site.ru/news/serial_zapretnaja_istorija/2016-03-05-1884&#91


Помогите сделать редирект, который бы автоматом с всех страниц убирал /news, /2016-03-05-1884 и добавлял .html
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Помогите с редиректом

Сообщение Bizdelnick »

Веб-сервер какой?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Помогите с редиректом

Сообщение Bizdelnick »

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
GNUUser
Сообщения: 89

Re: Помогите с редиректом

Сообщение GNUUser »

Решил как тут:http://joomlaforum.ru/index.php?topic=223542.0 написано

REDIRECTMATCH 301 (.*)/2016(.*)$ http://site.ru$1
REDIRECTMATCH 301 (.*)/2015(.*)$ http://site.ru$1
REDIRECTMATCH 301 (.*)/2014(.*)$ http://site.ru$1

REDIRECTMATCH 301 (.*/[^/.]+)($|\?)$ http://site.ru$1.html
_________________

Правило

REDIRECTMATCH 301 (.*)/2016(.*)$ http://site.ru$1

меняет категорию

news

на нужную категорию на новом сайте

Как это вообще возможно ? Это как раз то что нужно, я даже не мечтал об этом.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Помогите с редиректом

Сообщение Bizdelnick »

Исключительно кривое решение. Во-первых, RedirectMatch предназначен для перенаправления на другой сайт, а у Вас почти ровно тот случай, который описан вторым по приведённой мной ссылке. Во-вторых, всё решается одним правилом, а у Вас их зачем-то целых четыре. В-третьих, весьма вероятно срабатывание правил там, где они не нужны. В-четвёртых, не вижу, где тут убирается компонент пути /news, как Вы хотели. Ну и вообще регулярки просто ужасны. Я бы сделал примерно так (не проверялось, могут быть ошибки!):

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

RewriteEngine  on
RewriteRule    "^/news/([^/]+)/.*"  "/$1.html"  [R]
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
GNUUser
Сообщения: 89

Re: Помогите с редиректом

Сообщение GNUUser »

Bizdelnick писал(а):
08.03.2016 13:39

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

RewriteEngine  on
RewriteRule    "^/news/([^/]+)/.*"  "/$1.html"  [R]


не срабатывает :(
надо чтоб по шаблону перенаправляло с
http://site.ru/news/filmname/2016-03-02-1877
на
http://site.ru/category/filmname.html

REDIRECTMATCH 301 (.*)/2016(.*)$ http://site.ru$1
удаляет дату в конце урла и !каким-то образом заменяет news на соответствующую категорию фильма.
Я сам не верю: http://libreportal.net/htaccess.ogv

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

 #
 #
# Copyright (C) 2006-2010 Next Generation CMS (http://ngcms.ru)
# Name: .htaccess
# Description: mod_rewrite htaccess file
# Author: NGCMS project team
#
DefaultLanguage ru
AddDefaultCharset windows-1251
php_value default_charset "cp1251"
DirectoryIndex index.php

<files .htaccess>
order allow,deny
deny from all
</files>

#php_flag register_globals off
#php_flag magic_quotes_gpc off
#php_flag magic_quotes_runtime off
#php_flag magic_quotes_sybase off
#php_flag allow_call_time_pass_reference on
#php_value session.use_trans_sid 0

RewriteEngine On

RewriteBase /
REDIRECTMATCH 301 (.*)/2016(.*)$ http://site.ru$1
REDIRECTMATCH 301 (.*)/2015(.*)$ http://site.ru$1
REDIRECTMATCH 301 (.*)/2014(.*)$ http://site.ru$1

#Удаляет category
#RewriteRule ^(.*)category(.*)$ $2 [QSA,L,R=301,NC]

#Редирект с www на
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [S=35]


#Редирект на html
REDIRECTMATCH 301 (.*/[^/.]+)($|\?)$ http://site.ru$1.html

#Редирект с htm на html
RewriteCond %{REQUEST_URI} \.htm$
RewriteRule ^(.*) %{REQUEST_URI}l [R=301,L]



# Editable links
RewriteRule ^.+$ index.php?$1 [QSA,L]
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Помогите с редиректом

Сообщение Bizdelnick »

GNUUser писал(а):
08.03.2016 14:43
надо чтоб по шаблону перенаправляло с
http://site.ru/news/filmname/2016-03-02-1877
на
http://site.ru/category/filmname.html

Ну так Вы не написали, что Вам так надо, а телепатическими способностями я не наделён.

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

RewriteEngine  on
RewriteRule    "^/news/([^/]+)/.*"  "/category/$1.html"  [R]


GNUUser писал(а):
08.03.2016 14:43
REDIRECTMATCH 301 (.*)/2016(.*)$ http://site.ru$1
удаляет дату в конце урла и !каким-то образом заменяет news на соответствующую категорию фильма.

Да ладно? Что, и категорию угадывает? Прям чисто Watson.
А Вам не приходило в голову, что это никакая не магия, а сам движок может делать дополнительный редирект с http://site.ru/news/filmname.html на http://site.ru/category/filmname.html? Посмотрите в access.log, какие запросы получает сервер.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
GNUUser
Сообщения: 89

Re: Помогите с редиректом

Сообщение GNUUser »

Упростил до одной строки:
RewriteRule ^news/(.*)/(.*)$ news/$1 [R=301,L]
но это правило перенаправляет только статьи, а категории, такие как
http://site.ru/news/komedii/1-0-1
не хочет.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Помогите с редиректом

Сообщение Bizdelnick »

GNUUser писал(а):
08.03.2016 18:32
категории, такие как
http://site.ru/news/komedii/1-0-1

Ну вот видите, как всё замечательно: не прошло суток, как удалось из Вас вытянуть, что нужно редиректить ещё и URL'ы такого вида. ☺

GNUUser писал(а):
08.03.2016 18:32
RewriteRule ^news/(.*)/(.*)$ news/$1 [R=301,L]

Методом тыка освоить регулярные выражения, насколько я знаю, ещё никому не удавалось, так что давайте разбираться.
Во-первых скобки. Их смысл — захват строки, Вам надо захватить только одну строку, так что вторые скобки смысла не имеют.
Во-вторых, Вы захватываете часть между 'news/' и последним '/' ('komedii' в данном примере), и потом подставляете её ($1) в новый путь. Соответственно и получаете то, что получаете.
Если нужно менять URL'ы двух разных видов, то логично использовать для этого две разные инструкции (можно обойтись и одной, но регулярка получится чересчур навороченной). Например так:

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

RewriteRule "^/news(/[^/]+)/201[456]-.+" "/$1.html" [R=301,L]
RewriteRule "^/news/(.+)"                "/$1.html" [R=301,L]
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить