Назад | Перейти на главную страницу

.htaccess перезаписать http на https приводит к циклу

На сервере apache 2.2 с varnish я пытаюсь перенаправить http -> на https для всего Drupal Commons (http://commons.acquia.com/) сайт.

Поскольку varnish кеширует некоторые перенаправления (R = 301, но не R = 302, я думаю), я сначала получил свое перенаправление, работающее по адресу: 8080, который не обслуживается varnish.

Приведенный ниже код .htaccess успешно перенаправляет http: // foo.example.com:8080 на https: // foo.example.com. (Работает в Chrome, FF и Safari.)

# RewriteBase /

### Standard Drupal7 .htaccess above here  ###

# SSL REWRITES
RewriteCond %{SERVER_PORT} ^8080$
RewriteRule ^(.*)$ https://foo.example.com/$1 [NC,R=302,L]

### Standard Drupal7 .htaccess below here  ###

# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

Если я

  1. Измените 8080 в указанном выше на 80
  2. сохранить .htaccess
  3. перезапустить лак
  4. очистить кеш Drupal
  5. очистить кеш браузера
  6. посетите http: // foo.example.com

(Я неукоснительно делал это после каждого редактирования в .htaccess.)

Я получаю цикл перенаправления в Chrome, FF, Safari при посещении http: // foo.example.com.

Чтобы понять цикл, я изменил перенаправление следующим образом:

# SSL REWRITES
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://foo.example.com/$1/%{SERVER_PORT} [NC,R=302,L]

и я получил это в своей адресной строке: https: // foo.example.com/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80/80 / 80/80/80/80/80

Когда браузер перенаправляется на URL-адрес https, не должно быть SERVER_PORT = 443 ???

Изменение на R = 301 приводит к тому же циклу.

Тестирование% {HTTPS} приводит к тому же циклу.

# SSL REWRITES
#RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://foo.example.com/$1/%{HTTPS} [NC,R=301,L]

теперь я получаю это в своей адресной строке: https: // foo.example.com/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off/off / выкл / выкл / выкл / выкл / выкл

За http://drupal.org/node/181233#comment-278142http://drupal.org/node/823232#comment-3075288) Еще пробовал:

# SSL REWRITES
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ https://foo.example.com/$1/%{SERVER_PORT} [NC,R=301,L]

Пробовал с и без! отрицание -f и -d. В любом случае условие не соответствует, поэтому ничего не происходит. Я не знаю, зачем нужны эти -f, -d тесты ....

Я также попытался удалить замену регулярного выражения в RewriteRule

# SSL REWRITES
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^.*$ https://foo.example.com/ [R=301,L]

это по-прежнему приводит к возникновению цикла.

Любая помощь приветствуется.

Я узнал от администраторов сервера, что они прерывают SSL с помощью Pound на этом сервере. Это означает, что SSL работает, но переменные HTTP_SERVER не отражают ожидаемых мной значений. SERVER_PORT всегда будет 80, а HTTPS всегда будет отключен, независимо от истинного положения вещей.

При использовании mod_rewrite выгрузите переменные вашего сервера, чтобы увидеть, что вы можете протестировать с помощью RewriteCond. Видеть http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html#PHP_Code_access_Apache_Variables

Вы также можете перенаправить http на https, используя большинство языков программирования. У меня есть модуль 443session Drupal, работающий с этим сайтом - он использует этот подход. (Мне не нужно было указывать модулю устанавливать правила, даже если он не мог обнаружить, что HTTPS включен.)

Убедитесь, что вы также используете файлы cookie безопасного сеанса. Они нужны вам в дополнение к mod_ssl, чтобы предотвратить захват сеанса.

Для Drupal это старое, но хорошее http://drupalscout.com/knowledge-base/drupal-and-ssl-multiple-recipes-possible-solutions-https Я думаю, что drupal.org/project/443session - лучший вариант модуля на данный момент.