301 редирект в htaccess

123
siv1987
На сайте с 02.04.2009
Offline
427
#11

1) Редирект будет только со скрипта, который носит имя ^page\.php$, даже если и другие скрипты otherscripts.php юзают одноименные параметры.

2) Правильно, фактически адрес со слешем и без это две разные страницы. И незачем по двум адресам чтобы открывалась одна и та же страница. В данном случае отдается ошибка 404, что в принципе достаточно. Хотите редирект - ставьте редирект.

Lion_astana
На сайте с 22.12.2012
Offline
53
#12

siv1987, извини, а можно еще пару вопросов, а то совсем не могу сдружиться с этим делом:

1) Вот код который сейчас работает:

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]

RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/

RewriteRule ^index\.html$ http://www.site.ru/ [R=301,L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^id=(\d+)$

RewriteRule ^article\.php$ /%1/? [R=301,L]

RewriteRule ^([^/]*)/$ /article.php?id=$1 [L]

Т.е. что касается самих статей: было site.ru/article.php?id=N, стало site.ru/N/

Плюс работает 301 редирект со старых статей на новые.

Если я хочу сделать чтобы вид стал без слэша в конце, т.е. site.ru/N и убираю вот тут слэш:

^([^/]*)/$ делаю ^([^/]*)$, а в вашей строке с редиректом /%1/? делаю /%1? то не работает...

Если честно, то 3 ваших строки совсем не понимаю, отсюда и проблема. Подскажете где убрать в правилах слэш в конце?

2) Второй вопрос более сложный. Есть страница, которая выводит список статей: site.ru/articles.php

Нужно заменить ее на site.ru/pisanina

делаю так: RewriteRule ^pisanina$ /articles.php [L]

работает....

Теперь, по вашему примеру делаю 301 редирект:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^pisanina$

RewriteRule ^articles\.php$ [R=301,L]

не работает...

Но самая большая проблема - это что список сатей большой и появляется постраничная навигация:

http://www.site.ru/articles.php?page=2

Это нужно превратить в site.ru/pisanina/page/2/ и так далее.

Делаю так:

RewriteRule ^pisanina/page/([^/]*)/$ /articles.php?page=$1 [L]

работает...

НО! как сделать теперь редирект со старых адресов типа site.ru/articles.php?page=2 на site.ru/pisanina/page/2/, т.е. если где-то стоит ссылка на старый адрес и пользователь по ней перейдет, чтобы его переадресовало на новую страницу.

Очень-очень благодарю заранее!

siv1987
На сайте с 02.04.2009
Offline
427
#13
Lion_astana:
Если я хочу сделать чтобы вид стал без слэша в конце, т.е. site.ru/N и убираю вот тут слэш:

Зачем вам без слеша? Имхо, лучше оставьте с ним. Но по идее должно было сработать.

Lion_astana:

НО! как сделать теперь редирект со старых адресов типа site.ru/articles.php?page=2 на site.ru/pisanina/page/2/, т.е. если где-то стоит ссылка на старый адрес и пользователь по ней перейдет, чтобы его переадресовало на новую страницу.

Весь блок будет выглядеть примерно так

#редирект /article.php => /pisanina

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^articles\.php$ /pisanina? [R=301,L]

#редирект /article.php?page=1 => /pisanina/page/1/

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^page=(\d+)

RewriteRule ^articles\.php$ /pisanina/page/%1/? [R=301,L]

#реврайты

RewriteRule ^pisanina$ /articles.php [L]

RewriteRule ^pisanina/page/(\d+)/$ /articles.php?page=$1 [L]

Кстати, проверьте имя файла, а то у вас не понятно, то ли это article.php то ли articles.php

Lion_astana
На сайте с 22.12.2012
Offline
53
#14

siv1987, спасибо за ответ!

Если делаю так:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^id=(\d+)$

RewriteRule ^article\.php$ /%1? [R=301,L]

RewriteRule ^([^/]*)$ /article.php?id=$1 [L]

чтобы адрес сатьи без слэша, то выходит ошибка 500.

Чувствую не правильно убрать слэш здесь: /%1? [R=301,L]

Кстати, проверьте имя файла, а то у вас не понятно, то ли это article.php то ли articles.php

Список статей - articles.php

Сама статья - article.php

С остальным сейчас попробую...

siv1987
На сайте с 02.04.2009
Offline
427
#15
Lion_astana:
^([^/]*)$
чтобы адрес сатьи без слэша, то выходит ошибка 500.

Такие регулярные выражения лучше не юзать, потому что они ничего конкретного не обозначают, и под них многое что может попасть.

Lion_astana:
Список статей - articles.php
Сама статья - article.p

Тогда я ничего не понял, слишком много "я делаю так и не работает, я делают эдак и тоже не работает, а сделать так то не работает то, как сделать чтобы работало так". Напишите конкретные адреса которые нужно реврайтнуть и для которых нужно сделать редирект. И желательно предоставить пару примеров реальных адресов которые используются на сайте.

Lion_astana
На сайте с 22.12.2012
Offline
53
#16

siv1987, вы правильно меня поняли во всем, все работает, огромное спасибо.

Единственно что хотелось бы подшаманить это:

# Редирект 301 со старого адреса статьи на новый и преобразование старого адреса статьи на новый

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^id=(\d+)$

RewriteRule ^article\.php$ /%1/? [R=301,L]

RewriteRule ^(\d+)/$ /article.php?id=$1 [L]

То что приведено сверху прекрасно преобразовывает site.ru/article.php?id=2 в site.ru/2/

Как можно сделать чтобы в результате и преобразования и редиректа в итоге получалось site.ru/2 , т.е. без слэша в конце?

siv1987
На сайте с 02.04.2009
Offline
427
#17

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^id=(\d+)$

RewriteRule ^article\.php$ /%1? [R=301,L]

RewriteRule ^(\d+)$ /article.php?id=$1 [L]

должно работать

Lion_astana
На сайте с 22.12.2012
Offline
53
#18
должно работать

Ничего не понимаю, пробовал ведь так не один раз до этого...

РАБОТАЕТ!!!!!

siv1987, я вас очень благодарю!!!!!

Lion_astana
На сайте с 22.12.2012
Offline
53
#19

Добрый день!

siv1987, новая проблема со старым.... Как сделать то же самое что вы мне показали но когда в адресе 2 переменные? Вот пример:

Сделать реврайт и редирект 301 со старого адреса на новый,

если старый адрес:

site.ru/script.php?cat=12 нужно превратить в site.ru/tovary,

а затем site.ru/script.php?cat=12&page=5 в site.ru/tovary/page/5/

По аналогии с тем что вы показали делаю:

site.ru/script.php?cat=12 нужно превратить в site.ru/tovary,

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^cat=12

RewriteRule ^script\.php$ /tovary? [R=301,L]

RewriteRule ^tovary$ /script.php?cat=12 [L]

Это работает.

А вот если добавляется переменная page, то не работает, делаю так:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^cat=12&page=(\d+)

RewriteRule ^script\.php$ /tovary/page/%1/? [R=301,L]

RewriteRule ^tovary/page/(\d+)/$ /script.php?cat=12&page=$1 [L]

Подозреваю что неправильно делаю тут: RewriteCond %{QUERY_STRING} ^cat=12&page=(\d+)

Сможете подсказать, 2 переменные как подружить?

Заранее благодарю!

siv1987
На сайте с 02.04.2009
Offline
427
#20

RewriteCond %{QUERY_STRING} ^cat=12

заменить на

RewriteCond %{QUERY_STRING} ^cat=12$

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий