在HTTP_HOST冻结网站上RewriteCond?

时间:2010-07-21 13:59:09

标签: apache mod-rewrite

我有许多域指向同一个网络服务器,并希望将其设置为将所有传入流量重写为一个一致的域。我已经这样做之前确保请求有www。在其中,但当我将下面的脚本添加到网站时,它开始冻结。

 RewriteCond %{HTTP_HOST} !^www\.domain\.com(.*) [NC]
 RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,NC,L]

将此添加到我的.htaccess(在我所有其他重写之后)并将文件保存到服务器后,该网站将正常运行大约10秒钟,之后对它的请求将开始冻结。我知道这非常奇怪,这是在文件保存到服务器之后发生的。如果我删除上面的行,它将立即开始工作。

我有点迷失可能导致这个奇怪问题的原因。

更新 我在更改之前和之后检查了我的重写日志。我看到很多这些错误

 127.0.0.1 - - [21/Jul/2010:12:57:35 --0400] [280082-web1.dummy.com/sid#2b4899b49d30][rid#2b489a396148/initial] (2) [perdir /var/www/html/] rewrite '*' -> 'http://www.dummy.com/*'
 127.0.0.1 - - [21/Jul/2010:12:57:35 --0400] [280082-web1.dummy.com/sid#2b4899b49d30][rid#2b489a396148/initial] (2) [perdir /var/www/html/] explicitly forcing redirect with http://www.dummy.com/*

我还检查了访问日志中的相同时间戳,并看到:

 127.0.0.1 - - [21/Jul/2010:12:57:35 -0400] "OPTIONS * HTTP/1.0" 301 333 "-" "Apache/2.2.3 (Red Hat) (internal dummy connection)"

我确实已经开启了keepAlive。这会导致问题吗?

还尝试将此cond添加到我的重写中,但仍然存在错误: RewriteCond%{REMOTE_ADDR}!127.0.0.1

1 个答案:

答案 0 :(得分:1)

我首先要说的是,这是我的猜测(我对Apache处理的这方面并不过分熟悉),但对于评论来说有点冗长,希望它对调查有所帮助这有点远。

由于您可能正在运行像prefork这样的MPM,因此Apache管理子进程的方法包括向他们发送唤醒它们的请求。我认为这曾经是GET请求,但鉴于请求真实资源可能会为此目的在服务器上造成不必要的压力,它似乎现在发送OPTION请求。

您还说过KeepAlive设置为On。如果您的请求需要花费大量时间(就典型请求而言),您的子进程可能会被绑定到服务器需要生成新进程以处理其他传入流量的点。因此,如果您的MaxSpareServers值设置得足够低,一旦进程释放,Apache可能会有很多孩子被杀死。

要杀死它们,需要在日志中设置OPTION请求以确保它们处于清醒状态。这最终会由您的mod_rewrite规则处理,当与其他所有规则放在一起时,可能会导致您遇到的极端缓慢。

我不确定为什么你的RewriteCond无法阻止重定向。你可以尝试这个,但我不确定为什么它会有所不同:

RewriteCond %{REQUEST_METHOD} =OPTIONS [NC]
RewriteRule ^.*$ - [R=200,L]    

RewriteCond %{HTTP_HOST} !=www.example.com [NC]
RewriteRule ^.*$ http://www.example.com/$0 [R=301,L]