htaccess Mod rewrite

SM
На сайте с 03.09.2009
Offline
83
1049

Не могу додуматься как адреса страниц преобразовать.

Допустим адреса страниц такие:

site.ru/news/a1.html

site.ru/news/a2.html

site.ru/news/a3.html

таких страниц много и каждый файл находящийся в каталоге /news/ с расширением .html – хотелось бы превратить в такие:

site.ru/news/a1/

site.ru/news/a2/

site.ru/news/a3/

т.е. фактически чтоб без расширения были.

Как можно такое сделать?

кот Бегемот
На сайте с 07.12.2009
Offline
278
#1

Options +FollowSymLinks

RewriteEngine on

RewriteCond %{HTTP_HOST} ^site.ru

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]

файл .htacceess

Яндекс Директ, Гугд адворс, не дорого и ответственно. Телеграмм @H_Ilin
SM
На сайте с 03.09.2009
Offline
83
#2

garik77,

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

RewriteEngine on

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

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

А нужно на основании какого то шаблона это всё проделывать чтобы не для каждой странички прописывать редирект. Страничек может быть МНОГО.

gormarket
На сайте с 29.12.2010
Offline
47
#3

Сначала избавляемся от дубликатов, делаем 301 редирект страничек с расширением на адрес без расширения


RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(news/[^/]+)\.html$ $1/ [L,R=301]

Далее делаем реврайт (без редиректа) на файл html, когда будет запрошен адрес без расширения


RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(news/[^/]+)/$ $1.html [L]

Эти преобразования будут применяться ко всем без исключения файлам с расширением "html" в корне каталога "news"

Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
SM
На сайте с 03.09.2009
Offline
83
#4

gormarket,

Не доконца получилось.

А от каких сначала дубликатов избавляемся? )

На денвере тестю

При запросе адреса: site.ru/www/news/a1.html

Получается: http://site.ru/Z:/home/site.ru/www/news/a1/

И htaccess файл, я в папку www положил.

htaccess такой:


RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(news/[^/]+)\.html$ $1/ [L,R=301]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(news/[^/]+)/$ $1.html [L]
gormarket
На сайте с 29.12.2010
Offline
47
#5

добавьте базу реврайта (еще одну строчку в файл), чтоб стало так:


RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(news/[^/]+)\.html$ $1/ [L,R=301]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(news/[^/]+)/$ $1.html [L]

а исключение дубликатов страниц уже сделано в этих строчках

SM
На сайте с 03.09.2009
Offline
83
#6

gormarket, ВО! спасибо заработало) до такого я бы быстро недодумался)

А чтобы ещё такого добавить чтобы вызывая без конечного слеша

site.ru/www/news/a1

выдавало со слешем в конце

site.ru/www/news/a1/

gormarket
На сайте с 29.12.2010
Offline
47
#7

для принудительного добавления слеша нужно вставить в htaccess еще 3 строчки:


RewriteCond %{DOCUMENT_ROOT}/$0.html -f
RewriteRule ^news/[^/.]+$ $0/ [L,R=301]

что означает:

если при добавлении ".html" получается существующий файл,

и если запрашивается адрес, в котором после "news/" нет точек и слешей,

то выполняется 301 редирект на то же самое, но с добавлением завершающего слеша

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