Вы здесь

Как запретить переход по node/* ?

0

У каждой ноды будут созданы синонимы.
Необходимо чтобы при переходе (как пример) на http://dru.io/node/7547 была ошибка, а не редирект на синоним.
Но при этом если знать адрес синонима и зайти по нему - было бы всё хорошо.
Это нужно для возможности перебора страниц.

Версия Drupal: 
7.x
Вопрос задан 06.12.2016 - 11:10

Ответы

0

В Apache можно использовать следующее:

RedirectMatch "^/node/.*$" "http://new.example.com/страница-с-ошибкой"

Только это правило должно обязательно быть раньше правил для Rewrite

Ответ дан 06.12.2016 - 13:43

Спасибо!
Ваш ответ самый правильный оказался.
В связки с модулем subpathauto всё получилось.

Комментарий оставлен 07.12.2016 - 08:46

Выявилась новая проблема. При попытке добавить новый материал, он тоже переходит на эту страницу с ошибкой.
т.к. там url идет node/add/*
Как теперь решить не знаю..

Комментарий оставлен 10.12.2016 - 23:50

Нужно использовать более сложные regex'ы, например:

RedirectMatch "^/node/\d+$" "http://new.example.com/страница-с-ошибкой"

Но этот вариант легко обходится адресом типа /node/333/abracadabra. Поэтому, нужно сочинять regex с lookahead синтаксисом. Типа:

RedirectMatch "^/node/\d+(?!/(edit|revisions|addanother))$" "http://new.example.com/страница-с-ошибкой"

Но, это при условии, что apache поддерживает PCRE в полном объеме и, главное — я сочинил регулярное выражение правильно. Чтобы проверить нужно будет вспоминать Perl, прямо сейчас я не готов к этому. Поэтому советую начать с более простой формулы:

RedirectMatch "^/node/\d+(?!/edit)$" "http://new.example.com/страница-с-ошибкой"
Комментарий оставлен 11.12.2016 - 14:35

Сделал вот так два правила друг за другом:

RedirectMatch "^/node/\d+(?!/(edit|revisions|addanother))$" "страница с ошибкой"
RedirectMatch "^/node/\d+/.*$" "страница с ошибкой"

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

Комментарий оставлен 11.12.2016 - 14:58

По-хорошему, второе правило лишнее. Оно должно на 100% перекрываться первым, ну, если в первом корректный синтаксис. ))

Комментарий оставлен 11.12.2016 - 17:18

Если только первое правило использовать, то кракозябры пропускает такого вида /node/1/кракозябры

Комментарий оставлен 11.12.2016 - 19:10

удалил, т.к. обнаружил в очередных выражениях ошибку.

Комментарий оставлен 12.12.2016 - 13:39

ОК, пришлось вспоминать perl и получается следующее:

RedirectMatch "^/node/\d+/?$" "страница с ошибкой"
RedirectMatch "^/node/\d+/(edit|revisions)[^/]" "страница с ошибкой"
RedirectMatch "^/node/\d+/(?!(edit|revisions(/\d+/revert)?)/?$).+" "страница с ошибкой"

Первое правило редиректит url'ы — /node/333 и /node/333/
Второе редиректит — /node/333/editXXX
Третье редиректит url'ы — /node/333/bla-blah-blah, но игнорирует /node/333/edit, /node/333/edit/, /node/333/edit/bla-blah-blah, /node/333/revisions, /node/333/revisions/ и /node/333/revisions/666/revert.

Комментарий оставлен 12.12.2016 - 22:07