среда, 13 октября 2010 г.

Apache mod_rewrite и не только...

-----------------------------------------Регулярные выражения---------------------
Групирование

(abcd)
у него есть прикольная фишка -- запоминать и использовать уже найденные совпадения групировки, их можно использовать в построение динамических регекспов. 
Они сохраняются под номерами:
\1
\2
\3
\4
\5
\6
\7
\8
\9
В некоторых реализациях регекспов и дальше.

Эту способность можно использовать так:
(та|ту)-\1
Найдется: та-та, ту-ту
Но не найдется: ту-та, та-ту

Эта фишка называется "обратное ссылание"

Отключение "обратного ссылания"
(?:template)
Если не будет использоваться обратное ссылание в выражении, то его лучше отключить -- так будет искаться быстрее.


Без обратного ссылания работает и атомрный поиск
(?>template) -- возвращает толькое последнее совпадение.

Как это все работатет:
abccaxcc

Регексп: Результат: Запоминает:
a(bc|b|x)cc --> abcc \1 => b
--> axcc \2 => x
a(?:bc|b|x)cc --> abcc
--> axcc

a(?>bc|b|x)cc --> axcc
Ловушка атомарного поиска:
axxxa
a(?>x*)xa --> нифига, потому чтозвездочка сьест все иксы, возврата в группу нет, чтобы перед а был х:)

Включение/отключение нечувствительности к регистру(МОДИФИКАТОРЫ):
По умолчанию отключено
(?i) -- включить
(?-i) -- отключить
Example:
(?i)^something$

Можно использовать  модификаторы внутри групы:
(?i:tty) = (tty|TTY)

Коментарии:
Когда сложные регекспы, удобно вставлять в них комментарии
(?#comment)

A(?#comment)B --> AB

Просмотр вперед и назад
Результаты не содержат групировки (только то что подсвеченное в след примере)
(?=example) вперед
(?!example) вперед с отрицанием
(?<=example) назад 
(? назад с отрицанием

Людовик(?=XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL

Людовик(?!XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL

(?<=Сергей )Иванов Сергей Иванов, Игорь Иванов

(? Сергей Иванов, Игорь Иванов


Поиск по условию:(?(?=если)то|иначе)


--------------------------------------------mod_aliasing----------------------------------------------------

Alias /path/ /home/user/Documents/sitescontent/
В алиасе путь пишется всегда не относительно документ_рут. Поэтому можно перенаправлять вне рута, но там у вебсервера должны быть соответсвуюшие права файловой системы. И сразу после алиаса нужно прописать:
Alias /path/ /home/user/Documents/sitescontent/
sitescontent/>
Order allow, deny
Allow from all

-------------------------------------------mod_userdir------------------------------------------

Применяется для того, чтобы пользователи одного компьютера могли размещать свои публичные документы в веб.

Можно это делать так 
UserDir disabled
UserDir enabled user1 user2 user3
Или наоборот
UserDir enabled
UserDir disabled user1 user2 user3

Можно ставить папку в которую юзеры смогут ложить свои файлы для доступа из глобальной сети.

UserDir public_html -- это по умолчанию (папка оказывается в хомовой директории)
UserDir /usr/web
UserDir /home/*/www
UserDir /var/*/www

Чтобы все было доступным, нужно проследить чтобы у веб-демона был файловый доступ к этим местам на чтение и выполнение по всем уровням иерархии на пути в файлу.

------------------------------------mod_prefork, mod_worker, mod_threadpool----------------------------------------
Директива User
Обычно апач запускается под рутом, тогда эта директива сработает и он сменить права с рута на права указанного юзера. Если апач будет запушен не под рутом, то это не сработает и он будет работать под тем юзером, под которым он был запущен.
User unix-userid

--------------------------------------------------------mod_rewrite-------------------------------------------------------------------

Движок для перезаписи урлов в реальные пути к ресурсам.
Имеется две главные директивы 
RewriteRule
RewriteCond
Вторая -- это слуга первой:) 
Исторически первыми пишутся кондишины, они игнорируются пока не прочитается строка с рулом. Если строка урла удовлетворяет патерн рула, то тогда идет возврат к кондишинам, которые доуточняют точно ли урл подходит нашему правилу.

То есть между нашими кондишинами существует связь логического И. 
Чтобы между ними была связь ИЛИ, нужно использоваться флаг [OR].

Вообще у кондишина таких флагов два:
[OR]
[NC] -- без учета регистра (no case)

У рулов таких флагов много, о них чуть позже.

То есть понятно, идет сканирование конфиг файла, кондишины игнорируются, читаются рулы, если рул подходит, то идет возврат к первому кондишину перед рулом, и уже идет проход через все кондишины до рула.
Если все совпало, происходит рерайт урла. И идет сканирование дальше до следующего рула, рул же уже имеет дело с презаписаным урлом предыдущим совпавшим. Если его патерне подошел, идет возврат к первому кондишину после предыдущего рула, и пошли вниз -- все кондишины тоже удовлетворены, и этот рул вносит свою лепту в перезапсить.

Чтобы не дать портить урл следующим рулам, нужно после нашего рула поставить флаг [L](last)

Мы можем использовать обратные ссылания в наших рулах и кондишинах:
$N -- это ссылка на патерн с рула
%N -- а это ссылка на патерн с кондишина.
Их можна ставить в патрены кондишина, и в заменяющую строку рула.

Структора рула
RewriteRule Pattern RewriteResult [flags]
основыне флаги:
L -- ласт, следующие рулы свободны
P -- пропустить через модуль прокси (нужно не забыть поставить хттп:// и хостдомен перед улом)
E:VAR=VALUE -- утановить переменную среды
С -- чейн(цепочка), это указывает, что если данный урл не подходит правилу, то следущий считается с ним связанным -- работает с результатами первого--и он тоже пропускается.
F -- форбидден -- возвращает сразуже хттп 403 игнорирую дальнейшие правила
G -- ган, возвращает хттп 410, типа ресурса больше нет.
N -- некст, типа вернуться опять к первому рулу и пройтись по новой фазе цикла, но уже с изменненным предыдущей фазой урлом.
CO:=NAME:VAL:domain[:lifetime[:path]] -- поставить куку.
NC -- регистр пофиг.
NE -- no URI escaping of output. Не менять спецсимволы в результате рерайта -- это полезно чтобы наша ссылка на якорь не преваратилась в ссылкой с %код вместо "#" якоря.
NS -- не для сабреквеста. Если урл подошел под перезапись парвилом, но это внутренний(вызванный сервером к самому себе) реквест, то не применять это правило.
PT -- пасс сру, после отработки ререйт модуля, внутри апача меянтся состояние, которое указывает, что это уже не урл, а локальный файлпаз. Но если у нас после парвил стоит Аlias и результат рерайта совпадает с его условием, то произойдет креш, из-за состояния, что уже файл паз. Чтобы этого не произошло, ставим флаг, модуль алиас спокойно читает результат рерайта как урл и обращается по нужному файлпазу.
QSA -- query string append, урл для рула всегда приходит без параметров после знака "?". Единственный способ проверить эти параметры это кондишин и обращение в нем %{QUERY_STRING}. А чтобы нам в результате урла добавить параментры, нужно просто дописать в конец знак вопроса и нужные параметры. Если без этого флага, то старые будут перетерты, с этим -- добавлены к старым.
R[=code] -- сделать редирект. в коде темп поумолчанию, можно permanent, seeother, или номером. Опять же нужно не забыть о протоколе и и хосте с доменом в урле.
S=num -- пропустить num-количество последующих правил после совпадения с поточным.
T=MIME-type -- заставить сервер считать ресурс с установленным майм-тайпом.

Структура кондишина
RewriteCond TestString CondPattern [flags]
В тестстринге могут быть:
обратные ссылки на патерн рула
обратные ссылки с патернов пред кондишинов
Обращение к рерайтмапам
Переменные сервера

В кондпатернах могут быть кроме сравнений, отрицаний, регекспов и директивы:
-d -- проверить является ли кондишин сринг существующей директорией 
-f -- существующим файлом
-s -- файлом с размером больше 0
-l -- симлинка
-F -- существующим файлом, при этом происходит сабреквест -- проходит тест всех уровней настроек сервера и системы доступа к файлу
-U -- проверяется урл через сабреквест -- тест всех уровней настроек сервера.

Комментариев нет:

Отправить комментарий