2010-07-21 2 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 секунд, после чего просит к нему начнет замерзание. Я знаю, что это ОЧЕНЬ странно, это происходит ПОСЛЕ того, как файл сохраняется на сервере. Если я удалю строки выше, он начнет работать немедленно.

Я немного потерял то, что может вызвать эту странную проблему.

ОБНОВЛЕНИЕ: Я проверил свои журналы перезаписи, сравнивая до и после изменения. Я вижу много этих ошибок

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 включен. Может ли это вызвать проблему?

попытался также добавить этот конд к моему переписывают, и это все еще ошибки:! RewriteCond% {REMOTE_ADDR} 127.0.0.1

+0

Weird. Включили ли вы RewriteLog? Возможно, какой-то старый параметр mod_vhost_limit? Конфигурация (основного) vhost также может быть важна. – Wrikken

+0

Любая идея, почему я получаю ошибку 500, когда добавляю logging к моему .htaccess (я никогда не пробовал регистрироваться раньше).Код: RewriteEngine on RewriteLog "/var/www/rewrite.log" RewriteLogLevel 4 (правила) –

+0

Директивы ведения журнала применимы только в контексте сервера или виртуального сервера, поэтому вы не можете определить их в '.htaccess' файл. Кроме того, были ли какие-либо записи в вашем 'error_log' в то время, когда он начал замерзать, и ваш сайт получает значительный объем трафика или что-то еще? –

ответ

1

Начну с того, что это предположение с моей стороны (я не слишком знакомый с этим аспектом обработки Apache), но это было немного длинно для комментария, и, надеюсь, это поможет расследовать это немного дальше.

Поскольку вы, вероятно, используете MPM как prefork, метод управления дочерними процессами 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] 
+0

Crap все еще замерзает сайт. Я думаю, что я должен добавить RewriteCond для каждого из доменов вместо подстановочного знака. –

+0

Черт. Хм, я не полностью понимаю, вы можете уточнить, что вы имеете в виду? –

+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] –