Как правильно сделать редирект в .htaccess?

Подскажите, пожалуйста, как лучше сделать перенаправления старых страниц сайта на новые в htaccess. Старые страницы бывают двух типов:
site/catalog/nazvanie_categorii (может быть со слэшем в конце site/catalog/nazvanie_categorii )
site/catalog/nazvanie_categorii/nazvanie_tovara (может быть со слэшем в конце site/catalog/nazvanie_categorii/nazvanie_tovara )
catalog - статичный параметр. nazvanie_categorii и nazvanie_tovara динамические.
Перенаправляться должны на соответствующие страницы:
site/nazvanie_categorii.html
site/nazvanie_tovara.html

На site/nazvanie_categorii.html должны так же переадресовываться страницы с get-параметрами, например, site/catalog/nazvanie_categorii/?y=4555 или site/catalog/nazvanie_categorii?y=adgsgs. Значения get-переменных передавать на новый адрес не нужно.
  • Вопрос задан
  • 160 просмотров
Пригласить эксперта
Ответы на вопрос 2
shambler81
@shambler81 Куратор тега htaccess
https://www.donatstudios.com/RewriteRule_Generator
она умеет делать и редиректы с гетом и без гетов,
единственное она не умеет делать редирект на урл с гетом, посколку перев ? не ставит \? , но это можнро и руками сделать.
Теперь по слешу.
Он должен быть по умолчанию.
но тут нужно чуть больше исключений чем кажется.

############################################################################
#### Убираем повторяющиеся слеши (/) в URL ####
############################################################################
RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]
############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку) ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$
# Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
# И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
# Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
# И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
# Исключить слеш.

############################################################################
#### Добавляем слеш(/), если его нет, и это не файл. ####
############################################################################
RewriteCond %{REQUEST_URI} !(.*)/$
# Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
# Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
# В URL нет точки (файл).
RewriteRule ^(.*)$ $1/ [L,R=301]
# Добавляем слеш в конце.

############################################################################
#### Убираем index.php, если он есть в конце URL ####
############################################################################
RewriteCond %{REQUEST_METHOD} =GET
# Выявляем GET запрос в URL (не POST).
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
# URL cодержит index.php в конце.
RewriteRule ^(.*)$ %1/ [R=301,L]
# Удалить index.php из URL.
############################################################################
#### Компрессия статического контента для гугл  спид тест               ####
############################################################################
<IfModule mod_deflate.c>
  # Compress HTML, CSS, JavaScript, Text, XML and fonts
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType image/jpeg "access plus 3 day"
  ExpiresByType image/svg "access plus 3 day"
  ExpiresByType image/gif "access plus 3 day"
  ExpiresByType image/png "access plus 3 day"
  ExpiresByType text/javascript "access plus 3 day"
  ExpiresByType text/css "access plus 3 day"
  ExpiresByType application/javascript "access plus 3 day"
</IfModule>
Ответ написан
Комментировать
@vaserguy Автор вопроса
не знаю насколько это правильно, но я сделал вот так:
RewriteCond %{REQUEST_URI} ^/catalog\/([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_-]+)\/?$
RewriteRule ^catalog\/([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_-]+)\/?$ $2.html? [R=301,L]

RewriteCond %{REQUEST_URI} ^/catalog\/([a-zA-Z0-9_-]+)\/?$
RewriteRule ^catalog\/([a-zA-Z0-9_-]+)\/?$ $1.html? [R=301,L]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы