@bitrtr

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

Есть правила для редиректа:
# Remove trailing slash, question mark, and double slashes in URL
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule ^(.*)\/$ https://site.ru/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[^\\s]+\s+[^?]*?\?
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule .? https://site.ru%{REQUEST_URI}? [R=301,L]

RewriteCond %{THE_REQUEST} //
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule .* https://site.ru/$0 [R=301,L]


# Redirect from home, index, and URLs with trailing slash or query string to main page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*(home|index)(\.htm?|\.html?|\.php)?\ HTTP/
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule ^.*$ https://site.ru/ [R=301,L]

# Redirect to https://site.ru
RewriteCond %{HTTP_HOST} ^www\.site.ru\$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

На данный момент перенаправляет с https://www.site.ru// на https://site.ru// и только потом уже на https://site.ru/, а мне нужно сделать по ТЗ 1шаговый редирект. Подскажите пожалуйста как это сделать?
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 1
webrevenue
@webrevenue
Веб-дизайнер и SEO оптимизатор
Примерно так:
RewriteEngine On

# Redirect www to non-www
RewriteCond %{HTTP_HOST} ^www\.site\.ru [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

# Remove trailing slash, question mark, and double slashes in URL
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule ^(.*)/$ https://site.ru/$1 [R=301,L]

# Remove query string if it's empty
RewriteCond %{THE_REQUEST} ^[^\\s]+\s+[^?]*?\?
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule .? https://site.ru%{REQUEST_URI}? [R=301,L]

# Remove double slashes
RewriteCond %{THE_REQUEST} //
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule .* https://site.ru/$0 [R=301,L]

# Redirect home, index, and URLs with trailing slash or query string to main page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*(home|index)(\.htm?|\.html?|\.php)?\ HTTP/
RewriteCond %{REQUEST_URI} !^/administrator/
RewriteRule ^.*$ https://site.ru/ [R=301,L]


Изменения и объединение правил

1.Редирект с www на non-www теперь идет в самом начале, чтобы предотвратить промежуточные редиректы с `www`.

2. Правила для удаления конечного слэша и двойных слэшей теперь не конфликтуют, так как порядок проверки правил происходит до их выполнения, что позволяет обрабатывать дублирующие слэши и делать это в одном шаге.

3. Все условия, касающиеся административной части (`!^/administrator/`), оставлены для всех правил, чтобы избежать неправильных редиректов на одну из страниц админки.

Таким образом, теперь при нахождении URL с www или ненужными символами, будет происходить единый шаг перенаправления на правильный адрес без промежуточных этапов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы