RewriteCond %{REQUEST_URI} !/my-new-url\.html
RewriteRule ^ /my-new-url.html [R=301]
С этим связано несколько потенциальных проблем, особенно если учесть, что в комментарии вы намекаете, что, возможно, используете фронт-контроллер для «маршрутизации» URL.
Это перенаправление удовлетворяет условиям, изложенным в вопросе, но предполагает, что у вас нет других переписываний, у вас есть по существу «статический сайт» и вы не ссылаетесь на какие-либо статические ресурсы.
Выотсутствует флаг L
(last
), поэтому обработка будет продолжаться через файл и, возможно, будет перезаписана, если вы будете переписывать позже.
Если вы переписываете URL на передний план-контроллер для маршрутизации URL (как вы предлагаете в комментариях), тогда это перенаправление будет прервано, так как оно будет перенаправлено от фронт-контроллера.Вам нужно только перенаправить прямые запросы, т.е.когда переменная окружения REDIRECT_STATUS
равна пусто .
Если вы ссылаетесь на любые статические ресурсы в том же файловом пространстве, они также будут перенаправлены.Вам необходимо создать исключение для любых статических ресурсов, которые вы используете, либо по расширению файла (например, (css|js|jpg|png)
), либо по расположению (например, /static
).
Итак,вместо этого попробуйте следующее:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !\.(js|css|jpg|png)$
RewriteRule !^my-custom-url$ /my-custom-url [R=302,L]
Вам не нужно отдельное условие для реализации исключения для URL, на который вы перенаправляете.Более эффективно делать это непосредственно в шаблоне RewriteRule
.
Первое условие гарантирует, что мы перенаправляем только прямые запросы, а не переписываем запросы на ваш фронт-контроллер.
Второе условие позволяет избежать перенаправления любых статических ресурсов.Вы также можете проверить путь к файловой системе, если все ваши ресурсы хранятся в общем корне.Или, в крайнем случае, реализуйте проверки файловой системы (т. Е. RewriteCond %{REQUEST_FILENAME} !-f
), если ваши статические ресурсы слишком разнообразны - но учтите, что это менее эффективно.
Перед тестированием вам необходимо очистить кеш браузера,поскольку любые более ранние (ошибочные) 301-е постоянно кэшируются браузером.