2012-06-26 2 views
0

Недавно я купил подстановочный сертификат ssl для перемещения моего сайта на https. Поскольку Apache не может обрабатывать несколько виртуальных хостов под одним и тем же IP-адресом в отдельных s, я был вынужден использовать VirtualDocumentRoot из mod_vhost_alias. Это сначала решило мои проблемы с Apache и подстановочным сертификатом, но это было ненадолго.Бесконечный цикл при переписывании на https

В связи с необходимостью я решил переместить домашнюю страницу моего сайта в корень домена (то есть http://domain.com, а не http://www.domain.com). Как только я перешел, правила, которые я установил для перехода на https, вызывают бесконечный цикл на сервере, что приводит к ошибке 500. Обратите внимание, что те же правила, применяемые к любому поддомену, все еще работают, переписывая любой http на https.

Ошибка:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. 

Моего VirtualHost конфигурация:

<VirtualHost IP:443> 
    ... 
    VirtualDocumentRoot /.../public_html/%1/ 
    ... 
    VirtualScriptAlias /.../public_html/%1/cgi-bin/ 
    ... 
</VirtualHost> 

Моего .htaccess конфигурация:

SetEnv APPLICATION_ENV development 
Options +FollowSymlinks -Indexes 
RewriteEngine On 

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

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ - [NC,L] 
RewriteRule ^(.*)$ index.php [NC,L] 

<FilesMatch "\\.(js|css)$"> 
SetOutputFilter DEFLATE 
</FilesMatch> 

Мое приложение было построено с использованием Zend Framework.

Основная загадка здесь, почему она работает с любым поддоменом, но не тогда, когда я использую корневой поддомен. Любой намек на то, что может вызвать проблему? Есть ли способ увидеть все перезаписи de .htacess?

ответ

0

Попробуйте это:

RewriteEngine On 

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

RewriteCond %{REQUEST_FILENAME} !-s 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) index.php [L] 

Изменения:

  • www.domain.com и domain.com может быть согласован в одной строке, так что это сделал
  • проверка HTTPS вместо SERVER_PORT
  • redirect to HTTPT o n то же имя домена, что и запрос (изменение, если вы хотите, чтобы все указывали на одно имя).
  • вместо того, чтобы правила, которое будет «убивать» переписывания, с 3 RewriteCond х в OR, сводит на нет конд, чтобы применить к реальной власти в вопросе
  • нет никакого смысла установки NC флага при совпадении .*

Остальная часть .htaccess должна оставаться неизменной (не включая эти части).

Смежные вопросы