2012-06-04 2 views
1

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

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

Вот Rewrite:

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.

Вот карта (находится там, где Rewrite говорит):

#!/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 и возможного исправления, было бы весьма полезно.

Благодаря Greg

+0

Что вы имеете в виду, "он выходит из строя Apache". Какую ошибку он производит? – larsks

+0

Привет. После ввода этой строки кода Apache не будет перезапускаться и просто зависает, поэтому сайт не работает, пока я не удалю эту строку кода и не запустил Apache без этой строки Lock. – kidcobra

+0

И еще, какие ошибки он производит? Apache редко выходит из строя без появления в журнале ошибок. – larsks

ответ

4

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

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

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

+0

См. Мой вопрос по адресу http://stackoverflow.com/questions/16386974/apache-rewritelock-alternative-using-php. Является ли мой подход правильным способом делать то, что вы описываете? – Inator

Смежные вопросы