首页 文章

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

提问于
浏览
1

我在网络解决方案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),使用第三条信息作为用于加载文件的查询字符串,并在显示基于查询字符串aa的文件时将最初输入的URL保留在地址栏中 .

这是重写:

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 .

这是 Map (位于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和可能的修复的情况下才会有效,我们将不胜感激 .

谢谢格雷格

1 回答

  • 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

相关问题