LINUX.ORG.RU

.htaccess: что обозначет это RewriteRule?


0

1

Что-то не могу понять следующего.

Для фреймверков CodeIgniter и Kohana предлагают использ-овать следующую директиву в .htaccess:

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]

Она вроде как нужна для того, чтобы преобразовывать урлы из вида:

http://localhost/modules

в вид

http://localhost/index.php/modules

Однако у меня несколько вопросов о том, как работает эта директива.

1. Что поступает на вход данной директивы? Полный запрошенный в браузере URL:

http://localhost/modules

или кусок URL-а, без имени хоста:

modules

2. Следующий вопрос вытекает из предыдущего. Почему первая директива имеет такой странны вид:

^(?:application|modules|system)\b.*

- Почему признак повторения "?" стоит после спецсимвола "("? Ведь он же должен стоять после какого-нибудь символа или метасимвола.

- Зачем там используется двоеточие ":"? Вроде как в регвырах нет такого управляющего символа, значит это просто символ ":". Но в строке вида "http://localhost/modules" нигде не может встретитьися последовательность символов ":application". Какой смысл в таком регвыре?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

директива запрещает просмотр пользователям содержимого директорий application/modules/system, получает оно путь (без хоста).

rikardoac
()
Ответ на: комментарий от rikardoac

Ну а по-русски об ?: мне трудно объяснить. в мануале оно ясно описано https://httpd.apache.org/docs/2.2/rewrite/intro.html (пункт Regex Back-Reference Availability) - в общем, оно позволяет группировать совпадение с образцом и отдавать эти совпадения для дальнейшего использования с помощью переменных типа $0, $1, $n

rikardoac
()
Последнее исправление: rikardoac (всего исправлений: 2)
Ответ на: комментарий от rikardoac

(?:) не помещает свое содержимое в переменную, в отличие от обычных (). $0 будет заменен на всю подстроку, совпавшую с регуляркой.

anonymous
()

- Почему признак повторения "?" стоит после спецсимвола "("? Ведь он же должен стоять после какого-нибудь символа или метасимвола.

- Зачем там используется двоеточие ":"? Вроде как в регвырах нет такого управляющего символа, значит это просто символ ":". Но в строке вида "http://localhost/modules" нигде не может встретитьися последовательность символов ":application". Какой смысл в таком регвыре?

Это группировка без запоминания.

theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.