Я установил перенаправление с подстановочным знаком на одном из моих старых сайтов .htaccess
который перенаправляет все запросы на ту же страницу в новом домене:
#Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
Я бы хотел, чтобы домашняя страница старого домена перенаправляла на определенную страницу в новом домене. Поэтому я добавил эту строку поверх правила перенаправления с подстановочными знаками
#Options +FollowSymLinks
RewriteEngine on
Redirect 301 / https://example.com/specific-page/
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
Но это не работает. Не могли бы вы объяснить, в чем я ошибся?
Я тестировал это с помощью этого инструмента https://htaccess.madewithlove.be/ и это показывает, что с моими правилами нет никаких проблем.
Redirect
(mod_alias) и RewriteRule
(mod_rewrite) принадлежат разным модулям Apache и, следовательно, запускаются независимо и в разное время во время запроса. На Apache, Redirect
на самом деле работает после RewriteRule
, несмотря на очевидный порядок в файле конфигурации.
Итак, в опубликованных вами директивах RewriteRule
перенаправление фактически «выигрывает» и перенаправляет запрос, поскольку он обрабатывается первым.
Redirect 301 / https://example.com/specific-page/
Mod_alias Redirect
директива также соответствует префиксу, поэтому исходный URL, например /
(одинарная косая черта) действительно будет соответствовать все, а не только запросы корня документа (домашней страницы). И все, что находится после совпадения, копируется в конец целевого URL. Таким образом, указанная выше директива перенаправит /<something>
к https://example.com/specific-page/<something>
.
Чтобы перенаправить конкретный URL-адрес в другом месте, вам нужно добавить совершенно отдельное правило перед более общим перенаправлением.
Например:
RewriteEngine on
# Redirect the document root (homepage) only
RewriteRule ^$ https://example.com/specific-page/ [R=301,L]
# Redirect everything else
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
ОБНОВИТЬ: Обратите внимание, что ^$
(пустая строка) соответствует запрошенному URL-пути /
(одинарная косая черта) только. В конфигурации для каждого каталога (т.е. .htaccess
), RewriteRule
соответствует URL-пути без префикса косой черты. (Строго говоря, он соответствует URL-пути без префикса каталога, который является местоположением .htaccess
файл и всегда заканчивается косой чертой.)
Перед тестированием вам необходимо очистить кеш браузера. Рекомендуется сначала протестировать с 302 (временными) перенаправлениями, чтобы избежать проблем с кешированием.
#Options +FollowSymLinks
FollowSymLinks
требуется для работы mod_rewrite, но, вероятно, он уже включен в конфигурации вашего сервера.
Я тестировал это через этот инструмент https://htaccess.madewithlove.be/ и это показывает, что с моими правилами нет никаких проблем.
Этот инструмент в основном используется для тестирования mod_rewrite. И в этом случае ошибся.