.htaccess перенаправляет, если условие не соответствует / отрицательное условие - PullRequest
1 голос
/ 13 июня 2019

Я изменяю файл .htaccess устаревшего веб-приложения PHP.Я не знаком с синтаксисом apache .htaccess.Я нашел это руководство, https://www.elated.com/mod-rewrite-tutorial-for-absolute-beginners/. Я пытаюсь перенаправить все запросы на URL / путь, если URL запроса не является конкретным URL / путем.Например, все запросы к веб-сайту будут перенаправлены на localhost / my-custom-page, если URL-адрес запроса не является localhost / my-custom-page.

Я знаю, как перенаправить сопоставление 1 на 1 следующим образом

RewriteEngine on
RewriteRule ^my-old-url.html$ /my-new-url.html [R=301,L]

Но я пытаюсь сделать так, чтобы все запросы перенаправлялись на конкретную страницу, если только запрос не на эту страницу.Даже домашняя страница будет перенаправлена ​​на эту страницу.Как я могу это сделать, пожалуйста?

Когда я попробовал следующее решение

RewriteEngine on
  RewriteCond %{REQUEST_URI} !/my-new-url\.html
  RewriteRule ^ /my-new-url.html [R=301]

Я получаю ошибку

enter image description here

Я хочу проверить, используя условие ИЛИ.Например, если путь не является путем один или два, перенаправьте все запросы на путь один.

Ответы [ 2 ]

0 голосов
/ 15 июня 2019
RewriteCond %{REQUEST_URI} !/my-new-url\.html
RewriteRule ^ /my-new-url.html [R=301]

С этим связано несколько потенциальных проблем, особенно если учесть, что в комментарии вы намекаете, что, возможно, используете фронт-контроллер для «маршрутизации» URL.

Это перенаправление удовлетворяет условиям, изложенным в вопросе, но предполагает, что у вас нет других переписываний, у вас есть по существу «статический сайт» и вы не ссылаетесь на какие-либо статические ресурсы.

  1. Выотсутствует флаг L (last), поэтому обработка будет продолжаться через файл и, возможно, будет перезаписана, если вы будете переписывать позже.

  2. Если вы переписываете URL на передний план-контроллер для маршрутизации URL (как вы предлагаете в комментариях), тогда это перенаправление будет прервано, так как оно будет перенаправлено от фронт-контроллера.Вам нужно только перенаправить прямые запросы, т.е.когда переменная окружения REDIRECT_STATUS равна пусто .

  3. Если вы ссылаетесь на любые статические ресурсы в том же файловом пространстве, они также будут перенаправлены.Вам необходимо создать исключение для любых статических ресурсов, которые вы используете, либо по расширению файла (например, (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-е постоянно кэшируются браузером.

0 голосов
/ 13 июня 2019

Ваш вопрос немного расплывчат из-за вашей формулировки.Но я предполагаю, что это то, что вы на самом деле ищете:

RewriteEngine on
RewriteCond %{REQUEST_URI} !/my-new-url\.html
RewriteRule ^ /my-new-url.html [R=301]

В случае, если вы получаете внутреннюю ошибку сервера (http status 500), используя приведенное выше правило, есть вероятность, что вы используете очень старую версиюHTTP-сервер Apache.В этом случае вы увидите определенный намек на неподдерживаемый флаг [END] в файле журнала ошибок http-серверов.Вы можете попытаться обновить или использовать более старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от ваших настроек.

Хорошей идеей будет начать с временного перенаправления 302 и изменить его на постоянное перенаправление 301 позже, если вы уверены, что все настроено правильно.Это предотвращает проблемы с кэшированием при испытаниях ...

Это правило также будет работать в конфигурации хоста http-серверов или в файле динамической конфигурации (файл ".htaccess").Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на хосте http.Если вы используете динамический файл конфигурации, вам нужно позаботиться о том, чтобы его интерпретация была включена вообще в конфигурации хоста и чтобы он находился в папке DOCUMENT_ROOT хоста.

И общее замечание: вам всегда следует размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess").Эти динамические файлы конфигурации добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера.Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...