2010-07-21 113 views
1

我有一些域指向同一个网络服务器,并希望将其设置为将所有传入流量重写为一个一致的域。我以前做过这件事,确保请求有www。在其中,但是当我将下面的脚本添加到网站时,它开始冻结。RewriteCond在HTTP_HOST冻结网站?

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

我想补充后要对我的.htaccess(以上所有我的其他重写),将文件保存到服务器上,该网站通常会在大约10秒钟内未操作,并请求将其后才开始凝固起来。我知道这很奇怪,这发生在文件保存到服务器后。如果我删除上面的行,它会立即开始工作。

我有点失落,至于什么可能导致这个奇怪的问题。

UPDATE: 我检查了我重写日志之前比较和进行了更改后。我看到很多这些错误

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

+0

奇怪。你是否启用了RewriteLog?也许一些旧的mod_vhost_limit设置? (主)虚拟主机的配置也很重要。 – Wrikken 2010-07-21 14:10:00

+0

任何想法为什么我收到错误500时,我将日志记录添加到我的.htaccess(我从来没有尝试过日志记录)。代码:RewriteEngine on RewriteLog“/var/www/rewrite.log” RewriteLogLevel 4(rules) – 2010-07-21 15:23:02

+0

logging指令只适用于服务器或虚拟服务器上下文,所以你不能在'.htaccess'中定义它们文件。另外,当你的'error_log'开始冻结时,是否有任何条目?你的网站是否有大量的流量或任何东西? – 2010-07-21 16:44:45

回答

1

我会说这是我的一部分投机开始(我不会过于熟悉Apache处理的这一方面),但对于评论有点冗长,希望它有助于进一步研究这一点。

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

您还表示您已将KeepAlive设置为On。如果您的请求需要大量时间(就典型请求而言),则您的子进程可能会与服务器产生新进程以处理其他传入流量的点相关联。因此,如果你的值设置得足够低,一旦进程释放,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] 
+0

垃圾仍然冻结网站。我想我必须为每个域添加一个RewriteCond,而不是通配符。 – 2010-07-21 22:37:56

+0

该死的。嗯,我没有完全遵循,你能详细说明你的意思吗? – 2010-07-22 07:08:31

+0

喜欢它: RewriteCond%{HTTP_HOST} = www.foo.com [NC] RewriteCond%{HTTP_HOST} = www.bar.com [OR,NC] RewriteRule ^。* $ http://www.domain。 com/$ 0 [R = 301,L] – 2010-07-23 14:52:39