1

私は Network Solutions VPS を使用しており、4 つのドメイン名が IP を共有しています。動作する Rewrite / RewriteMap のセットアップがあります。書き換えは、var/www/vhosts/example.com/conf/vhost.conf にある example.com Web アドレスのファイルにあり、書き換えは vhost.conf ファイル内の唯一のものです。サーバーのメインの httpd.conf ファイルでは機能しません。

RewriteMap は、ユーザーが入力した URL (http://example.com/bb/cc) のいくつかを使用して、一致するデータベース レコードから 3 番目の情報 (aa) を取得し、その 3 番目の情報を次のように使用します。クエリ文字列を使用してファイルをロードし、クエリ文字列 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 を使用しないようにしています。

これがマップです(リライトが言う場所にあります):

#!/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 は、サーバー構成レベルで 1 回だけ指定する必要があります。このロック ファイルは、すべての 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 に答える