1

我在一个Network Solutions VPS上,四个域名共享IP。我有一个有效的 Rewrite / RewriteMap 设置。重写位于 var/www/vhosts/example.com/conf/vhost.conf 中 example.com 网址的文件中,重写是 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。

这是地图(位于 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 和可能的修复的情况下才能工作,将不胜感激。

谢谢格雷格

4

1 回答 1

4

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

RewriteLock 应该在服务器配置级别指定,并且只指定一次。此锁定文件将被所有 prg 类型映射使用。所以如果你想使用多个prg映射,我建议使用内部锁定机制,例如在PHP中有flock函数,并且简单地忽略apache在错误日志中写入的警告。

请参阅此处了解更多信息: http:
//books.google.com/books ?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false

于 2012-10-04T18:10:25.930 回答