RewriteLock вешает Apache при перезапуске при добавлении к работающей в противном случае Rewrite / Rewritemap

Я нахожусь на VPS Решений для Сети, четыре доменных имени разделяют IP. У меня есть Rewrite / RewriteMap, который работает. Перезаписываемый файл находится в файле для веб-адреса example.com по адресу var/www/vhosts/example.com/conf/vhost.conf, а перезапись - единственная вещь в файле vhost.conf. Это не будет работать в основном файле httpd.conf для сервера.

RewriteMap использует несколько вещей в URL, набранном пользователем (http://example.com/bb/cc), чтобы получить третий фрагмент информации (aa) из соответствующей записи базы данных, использует этот третий фрагмент информации в качестве строка запроса для загрузки файла и оставляет первоначально введенный URL-адрес в адресной строке, показывая файл на основе строки запроса aa.

Вот переписать:

Options +FollowSymlinks
RewriteEngine on
RewriteMap newurl "prg://var/www/cgi-bin/examplemap.php"
RewriteRule ^/(Example/.*) ${newurl:$1} [L]

Когда я добавляю следующее выше или ниже строки RewriteMap:

RewriteLock /var/lock/mapexamplelock

и попробуйте перезапустить Apache, он зависает, и Apache не перезапустится. Я пробовал разные пути к файлам (думая, что это может быть проблема с разрешениями и просто надеясь, что это сработало, конечно), убирая начальные /, помещая их в кавычки, разные типы файлов (т.е. .txt в конце), разные имена файлов, почти что-нибудь, и каждый раз, когда он зависает Apache при перезапуске. Rewrite / RewriteMap работает без него, но я много читал о важности RewriteLock, и php выдает предупреждения в журнале, заканчивающемся в DANGEROUS, чтобы не использовать RewriteLock.

Вот карта (расположена там, где написано "Переписать"):

#!/usr/bin/php
<?php
include '/pathtodatabase';
set_time_limit(0);
$keyboard = fopen("php://stdin","r");
while (1) {
$line = fgets($keyboard);
if (preg_match('/(.*)\/(.*)/', $line, $igot)) {
$getalias = mysql_query("select aa FROM `table`.`dbase` WHERE bb = '$igot[1]' && cc =     '$igot[2]'");
while($row=mysql_fetch_array($getalias)) {
$arid = $row['aa'];
}
print "/file-to-take-load.php?aa=$arid\n";
}
else {
print "$line\n";
}
}
?>

Я заглянул в основной файл httpd.conf и ничего не могу найти о RewriteLock, который мог бы помешать. Это просто стандартная комплектация VPS.

Если у кого-то есть идея о том, почему это будет работать только без RewriteLock и возможного исправления, это будет с благодарностью.

Спасибо Грег

1 ответ

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

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

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

Другие вопросы по тегам