Назад | Перейти на главную страницу

Можно ли с помощью htaccess установить исключение для перенаправления с подстановочными знаками?

Я установил перенаправление с подстановочным знаком на одном из моих старых сайтов .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. И в этом случае ошибся.