簡體   English   中英

當RewriteLock添加到其他正常工作的Rewrite / Rewritemap時,會重新啟動Apache

[英]RewriteLock hangs Apache on re-start when added to an otherwise working Rewrite / 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),使用第三條信息作為用於加載文件的查詢字符串,並在顯示基於查詢字符串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。

這是地圖(位於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和可能的修復的情況下才會有效,我們將不勝感激。

謝謝格雷格

如果您定義了多個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM