Понимание Apache RewriteMap с помощью RewriteLock - PullRequest
8 голосов
/ 12 июля 2011

Я взял на себя разработку довольно тяжелого приложения LAMP. Оригинальный разработчик использовал файл .htaccess с RewriteMap и сценарием PHP для обработки определенных условий приложения.

В частности, когда клиент запрашивает определенные шаблоны поддоменов, RewriteMap перехватывает их и отправляет в соответствующий модуль приложения.

Мне вполне комфортно с обычными перенаправлениями mod_rewrite, и я думаю, что у меня есть базовая концепция RewriteMap; но я изо всех сил пытаюсь найти достойную документацию о том, как работает RewriteLock. Согласно документации Apache:

Эта директива устанавливает имя файла для файла синхронизации синхронизации, который необходим mod_rewrite для связи с программами RewriteMap. Установите этот файл блокировки на локальный путь (не на устройстве, смонтированном в NFS), если вы хотите использовать перезаписывающую карту-программу. Это не требуется для других типов переписывания карт.

Но это все еще немного расплывчато для меня. Какова точная цель и функции RewriteLock и как она работает?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

RewriteLock используется с ключевым словом prg:. RewriteMap может использоваться с несколькими ключевыми словами, для использования текстовых файлов (txt:), хеш-файлов (dbm:), рандомизированного текста (rnd:) или сценариев внешнего сопоставления (это prg: ключевое слово). В этом режиме внешний скрипт запускается при запуске apache. Затем для каждого входящего запроса, когда mod-rewrite вызывает отображение prg:, apache отправляет входные данные этому сценарию и считывает выходной поток, чтобы получить значение.

RewriteLock должен использоваться в этом случае для предотвращения параллельных запросов (например, параллельных входов к этому внешнему процессу) для смешивания ответов на стандартный вывод этого процесса. Это механизм блокировки (файл, заданный путь, который является классическим токеном, только один пользователь) для обеспечения сериализации вызовов к этому внешнему сценарию отображения. ИМХО, это должно быть прозрачно применено mod-rewrite при использовании prg: как я никогда не находил случай prg, где эта блокировка не обязательна .

Редактировать:

На самом деле вы могли бы использовать внешний prg: без rewriteLock, если рандомизация выходных данных не является проблемой, т.е. для данной записи вы можете получить ответ, который был дан для другой записи, как в сценарии, выполняющем некоторые расширенные rnd :, ваш собственный сервис круговой проверки. Но если выходные данные должны отражать запись, то вам нужен этот семафор, который, конечно, может замедлить процесс перезаписи карты.

Так что, если вы используете только hashmap или textmap, вам не нужно устанавливать RewriteLock.

Редактировать:

Вы можете найти полезную информацию в этом потоке , например, тот факт, что файл блокировки существует только в течение нескольких миллисекунд, когда apache вызывает prg и ожидает ответа.

Edit: На вопрос один странный факт:

Оригинальный разработчик использовал файл .htaccess с RewriteMap

Это странно, потому что RewriteMap не может работать с файлами .htaccess, .htaccess - записи конфигурации, которые читаются динамически, а RewriteMap, как указано здесь в строке Context , можно установить только в главном Конфигурация или в конфигурации VirtualHost. Это не может быть в местоположении, каталоге или .htaccess. Так что, скорее всего, это никогда не сработает в .htaccess.

Теперь @puk попросил привести пример использования RewriteMap. Что ж, поиск «RewriteMap» в переполнении стека покажет вам несколько реальных примеров:

0 голосов
/ 04 октября 2012

Apache зависает, если вы определяете более одной директивы RewriteLock или используете ее в конфигурации VHOST.

RewriteLock должен быть указан на уровне конфигурации сервера и ТОЛЬКО ОДИН РАЗ. Этот файл блокировки будет использоваться всеми картами типа prg. Поэтому, если вы хотите использовать несколько карт prg, я предлагаю использовать механизм внутренней блокировки, например, в PHP есть функция flock, и просто игнорируйте предупреждения apache, записываемые в журнал ошибок.

Смотрите здесь для получения дополнительной информации: http://books.google.com/books?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false

...