当RewriteLock添加到其他正常工作的Rewrite / Rewritemap时,会重新启动Apache

时间:2012-06-04 14:40:10

标签: apache mod-rewrite virtualhost rewritemap

我在网络解决方案VPS上,有四个域名共享IP。我有一个Rewrite / RewriteMap设置有效。 Rewrite位于var / www / vhosts / example.com / conf / vhost.conf中example.com Web地址的文件中,Rewrite是vhost.conf文件中唯一的内容。它不适用于服务器的主httpd.conf文件。

RewriteMap在用户输入的URL中使用了一些东西(http://example.com/bb/cc)从匹配的数据库记录中获取第三条信息(aa),使用第三块info作为加载文件的查询字符串,并在显示基于查询字符串aa的文件时将最初输入的URL保留在地址栏中。

这是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

1 个答案:

答案 0 :(得分:4)

如果您定义了多个RewriteLock指令或者在VHOST配置中使用它,Apache会挂起。

RewriteLock应在服务器配置级别指定,并且仅在ONCE上指定。所有prg类型映射都将使用此锁定文件。因此,如果您想使用多个prg映射,我建议使用内部锁定机制,例如在PHP中有flock函数,并且只是忽略错误日志中的警告apache写入。

有关详细信息,请参见此处:
http://books.google.com/books?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false