2014-03-05 6 views
2

Я работаю над сайтом Drupal, для которого клиент попросил удалить «www.». от URL. Это очень просто, и я сделал это раньше; Я просто закомментируйте предложенные строки в Drupal сгенерированного файла .htaccess следующим образом:Почему RewriteCond% {HTTPS} не возвращает правильное значение?

# To redirect all users to access the site WITHOUT the 'www.' prefix, 
# (http://www.example.com/... will be redirected to http://example.com/...) 
# uncomment the following: 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule^http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301] 

Те из вас, кто знаком с .htaccess Drupal будет знать, что переменная окружения protossl устанавливается в верхней части файла, как так :

# Set "protossl" to "s" if we were accessed via https://. This is used later 
# if you enable "www." stripping or enforcement, in order to ensure that 
# you don't bounce between http and https. 
RewriteRule^- [E=protossl] 
RewriteCond %{HTTPS} on 
RewriteRule^- [E=protossl:s] 

Это прекрасно работает в моей локальной среде, но когда я развернул переход на производственный участок, он разбился. www.mysite.com перенаправляет на mysite.com, как и ожидалось, но https://www.mysite.comтакже перенаправляет на mysite.com вместо https://mysite.com. Кажется, что переменная %{HTTPS} возвращает «выключен», даже когда она должна быть «включена».

Я могу перейти непосредственно к https://mysite.com, и он отлично работает. Журналы доступа к сайту Apache показывают «https: //», где я ожидаю, что это так, как и все мои HTTP-запросы. Сайт работает на сервере RackSpace, используя балансировщик нагрузки (только один узел в балансировке). Сертификат SSL находится на балансировщике нагрузки RackSpace. Я попытался следующие шаги и никто из них не было никаких результатов:

  • Заменить RewriteCond с RewriteCond %{ENV:HTTPS} on [NC]
  • Заменить RewriteCond с RewriteCond %{SERVER_PORT} ^443$
  • Множественные вариации и комбинации из вышеуказанных RewriteCond в
  • Добавлено $conf['https'] = TRUE; в settings.php

Это водит моих коллег, и я с ума сошел. Может ли кто-нибудь помочь?

+2

Если вы находитесь за прокси-сервером, попробуйте: '% {HTTP: X-Forwarded-Proto}' переменная. – anubhava

+0

Это сделало трюк! Спасибо вам большое, сэр. – TGPrankster

+0

Добро пожаловать, рад, что это сработало. – anubhava

ответ

3

anubhava спас день! Решение состояло в том, чтобы использовать переменную %{HTTP:X-Forwarded-Proto} так же, как он предложил. Я обновил немного обнаружения протокола моего .htaccess, чтобы выглядеть следующим образом:

# Set "protossl" to "s" if we were accessed via https://. This is used later 
# if you enable "www." stripping or enforcement, in order to ensure that 
# you don't bounce between http and https. 
RewriteRule^- [E=protossl] 
# The default proto detection provided by Drupal does not work on our 
# production server because it sits behind a load-balancing server. 
# This additional RewriteCond makes sure we can detect the forwarded proto 
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR] 
RewriteCond %{HTTPS} on 
RewriteRule^- [E=protossl:s] 

Я позову это crunchwrap высший, потому что это хорошо идти!

+0

Огромное вам спасибо, это полностью спасло мой день :) –